@@ -134,7 +134,7 @@ def attribute(*names, default: nil)
134
134
135
135
singleton_class . delegate ( *names . flat_map { |name | [ name , "#{ name } =" ] } , to : :instance , as : self )
136
136
137
- defaults . merge! names . index_with { default }
137
+ self . defaults = defaults . merge ( names . index_with { default } )
138
138
end
139
139
140
140
# Calls this callback before #reset is called on the instance. Used for resetting external collaborators that depend on current values.
@@ -188,12 +188,12 @@ def method_added(name)
188
188
end
189
189
end
190
190
191
- class_attribute :defaults , instance_writer : false , default : { }
191
+ class_attribute :defaults , instance_writer : false , default : { } . freeze
192
192
193
193
attr_accessor :attributes
194
194
195
195
def initialize
196
- @attributes = merge_defaults! ( { } )
196
+ @attributes = resolve_defaults
197
197
end
198
198
199
199
# Expose one or more attributes within a block. Old values are returned after the block concludes.
@@ -213,20 +213,14 @@ def set(attributes, &block)
213
213
# Reset all attributes. Should be called before and after actions, when used as a per-request singleton.
214
214
def reset
215
215
run_callbacks :reset do
216
- self . attributes = merge_defaults! ( { } )
216
+ self . attributes = resolve_defaults
217
217
end
218
218
end
219
219
220
220
private
221
- def merge_defaults! ( attributes )
222
- defaults . each_with_object ( attributes ) do |( name , default ) , values |
223
- value =
224
- case default
225
- when Proc then default . call
226
- else default . dup
227
- end
228
-
229
- values [ name ] = value
221
+ def resolve_defaults
222
+ defaults . transform_values do |value |
223
+ Proc === value ? value . call : value . dup
230
224
end
231
225
end
232
226
end
0 commit comments