Permalink
Browse files

Not using class_eval wasn't adding clarity here

  • Loading branch information...
wycats committed Apr 10, 2010
1 parent 093ab3e commit 76e0a9eb5b5ad17d51dad5e4e8c5ea1ed504ea88
Showing with 24 additions and 15 deletions.
  1. +24 −15 activesupport/lib/active_support/core_ext/class/attribute.rb
@@ -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
+
+ 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

0 comments on commit 76e0a9e

Please sign in to comment.