Not using class_eval wasn't adding clarity here
This commit is contained in:
parent
093ab3ec6e
commit
76e0a9eb5b
@ -1,5 +1,4 @@
|
||||
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
|
||||
|
||||
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 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
|
||||
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user