aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/core_ext/class
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport/lib/active_support/core_ext/class')
-rw-r--r--activesupport/lib/active_support/core_ext/class/attribute.rb25
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