提交 76e0a9eb 编写于 作者: W wycats

Not using class_eval wasn't adding clarity here

上级 093ab3ec
require 'active_support/core_ext/kernel/singleton_class'
require 'active_support/core_ext/module/delegation'
require 'active_support/core_ext/module/remove_method'
class Class
......@@ -41,21 +40,31 @@ class Class
def class_attribute(*attrs)
instance_writer = !attrs.last.is_a?(Hash) || attrs.pop[:instance_writer]
s = singleton_class
attrs.each do |attr|
s.send(:define_method, attr) { }
s.send(:define_method, :"#{attr}?") { !!send(attr) }
s.send(:define_method, :"#{attr}=") do |value|
singleton_class.remove_possible_method(attr)
singleton_class.send(:define_method, attr) { value }
end
attrs.each do |name|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
def self.#{name}() nil end
def self.#{name}?() !!#{name} end
def self.#{name}=(val)
singleton_class.class_eval do
remove_possible_method(:#{name})
define_method(:#{name}) { val }
end
end
def #{name}
defined?(@#{name}) ? @#{name} : singleton_class.#{name}
end
define_method(attr) { self.singleton_class.send(attr) }
define_method(:"#{attr}?") { !!send(attr) }
define_method(:"#{attr}=") do |value|
singleton_class.remove_possible_method(attr)
singleton_class.send(:define_method, attr) { value }
end if instance_writer
def #{name}?
!!#{name}
end
RUBY
if instance_writer
body = "def #{name}=(value) @#{name} = value end"
class_eval body, __FILE__, __LINE__ - 1
end
end
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册