diff options
author | Jeremy Kemper <jeremy@bitsweat.net> | 2010-03-08 16:08:46 -0800 |
---|---|---|
committer | Jeremy Kemper <jeremy@bitsweat.net> | 2010-03-08 16:20:54 -0800 |
commit | 60bbf16bfd60493c05bf9c9c70ec962a0c482155 (patch) | |
tree | 44ed4816878f307d11437665fa1a7b56c6682be0 /activesupport/lib/active_support | |
parent | 47d252f9928568620844edce2161acd457c352c0 (diff) | |
download | rails-60bbf16bfd60493c05bf9c9c70ec962a0c482155.tar.gz rails-60bbf16bfd60493c05bf9c9c70ec962a0c482155.tar.bz2 rails-60bbf16bfd60493c05bf9c9c70ec962a0c482155.zip |
class_attribute gets instance methods which delegate to but may override their class values as you'd expect. Disable instance writer methods with :instance_writer => false.
Diffstat (limited to 'activesupport/lib/active_support')
-rw-r--r-- | activesupport/lib/active_support/core_ext/class/attribute.rb | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/activesupport/lib/active_support/core_ext/class/attribute.rb b/activesupport/lib/active_support/core_ext/class/attribute.rb index 1bd39a9349..c18905b369 100644 --- a/activesupport/lib/active_support/core_ext/class/attribute.rb +++ b/activesupport/lib/active_support/core_ext/class/attribute.rb @@ -24,14 +24,35 @@ class Class # For convenience, a query method is defined as well: # # Subclass.setting? # => false + # + # Instances may overwrite the class value in the same way: + # + # Base.setting = true + # object = Base.new + # object.setting # => true + # object.setting = false + # object.setting # => false + # Base.setting # => true + # + # To opt out of the instance writer method, pass :instance_writer => false. + # + # object.setting = false # => NoMethodError 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| + s.send(:define_method, :"#{attr}?") { !!send(attr) } + s.send(:define_method, :"#{attr}=") do |value| singleton_class.send(:define_method, attr) { value } end + + define_method(attr) { self.class.send(attr) } + define_method(:"#{attr}?") { !!send(attr) } + define_method(:"#{attr}=") do |value| + singleton_class.send(:define_method, attr) { value } + end if instance_writer end end end |