8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
# File 'lib/l43/open_object/initializer.rb', line 8
def define_initialize(klass, atts, defaults, blk)
klass.define_method :initialize do |**kwds|
spurious = kwds.keys - atts - defaults.keys
raise ArgumentError, "spurious keyword parameters: #{spurious.inspect}" unless spurious.empty?
values = defaults.merge(kwds)
values.each do |key, value|
instance_variable_set("@#{key}", value)
end
if blk
more_values = instance_exec(OpenStruct.new(values), &blk)
if Hash === more_values
more_values.each do |key, value|
instance_variable_set("@#{key}", value)
end
values = values.merge(more_values)
end
end
missing = atts - values.keys
raise ArgumentError, "missing required keyword parameters: #{missing.inspect}" unless missing.empty?
if respond_to?(:_init)
_init
end
if klass.mutable?
Initializer.define_dynamic_to_h(klass, values.keys)
else
Initializer.define_to_h(klass, values.keys)
to_h
freeze
end
end
klass.instance_eval do
@__atts__ = atts.freeze
@__defaults__ = defaults.freeze
end
end
|