Skip to content

Commit dfa439e

Browse files
dylanahsmithkamipo
authored andcommitted
activesupport: Simplify class_attribute implementation (#35454)
* activesupport(class_attribute): Use redefine_singleton_method * activesupport(class_attribute): Use keyword arguments * activesupport(class_attribute): Avoid unnecessary redefinition for default
1 parent f4a30d2 commit dfa439e

File tree

1 file changed

+10
-15
lines changed

1 file changed

+10
-15
lines changed

activesupport/lib/active_support/core_ext/class/attribute.rb

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,17 @@ class Class
8484
# To set a default value for the attribute, pass <tt>default:</tt>, like so:
8585
#
8686
# class_attribute :settings, default: {}
87-
def class_attribute(*attrs)
88-
options = attrs.extract_options!
89-
instance_reader = options.fetch(:instance_accessor, true) && options.fetch(:instance_reader, true)
90-
instance_writer = options.fetch(:instance_accessor, true) && options.fetch(:instance_writer, true)
91-
instance_predicate = options.fetch(:instance_predicate, true)
92-
default_value = options.fetch(:default, nil)
93-
87+
def class_attribute(
88+
*attrs,
89+
instance_accessor: true,
90+
instance_reader: instance_accessor,
91+
instance_writer: instance_accessor,
92+
instance_predicate: true,
93+
default: nil
94+
)
9495
attrs.each do |name|
9596
singleton_class.silence_redefinition_of_method(name)
96-
define_singleton_method(name) { nil }
97+
define_singleton_method(name) { default }
9798

9899
singleton_class.silence_redefinition_of_method("#{name}?")
99100
define_singleton_method("#{name}?") { !!public_send(name) } if instance_predicate
@@ -102,9 +103,7 @@ def class_attribute(*attrs)
102103

103104
singleton_class.silence_redefinition_of_method("#{name}=")
104105
define_singleton_method("#{name}=") do |val|
105-
singleton_class.class_eval do
106-
redefine_method(name) { val }
107-
end
106+
redefine_singleton_method(name) { val }
108107

109108
if singleton_class?
110109
class_eval do
@@ -137,10 +136,6 @@ def class_attribute(*attrs)
137136
instance_variable_set ivar, val
138137
end
139138
end
140-
141-
unless default_value.nil?
142-
self.send("#{name}=", default_value)
143-
end
144139
end
145140
end
146141
end

0 commit comments

Comments
 (0)