6
7
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
# File 'lib/blocks/utilities/dynamic_configuration.rb', line 6
def add_config(*attrs)
options = attrs.
instance_reader = options.fetch(:instance_accessor, true) && options.fetch(:instance_reader, true)
instance_writer = options.fetch(:instance_accessor, true) && options.fetch(:instance_writer, true)
instance_predicate = options.fetch(:instance_predicate, true)
default_value = options.fetch(:default, nil)
attrs.each do |name|
define_singleton_method(name) do |value="UNDEFINED"|
if value == "UNDEFINED"
default_value
else
public_send("#{name}=", value)
end
end
define_singleton_method("#{name}?") { !!public_send(name) } if instance_predicate
ivar = "@#{name}"
define_singleton_method("#{name}=") do |val|
singleton_class.class_eval do
remove_possible_method(name)
define_method(name) do |value="UNDEFINED"|
if value == "UNDEFINED"
val
else
public_send("#{name}=", value)
end
end
end
class_eval do
remove_possible_method(name)
define_method(name) do
if instance_variable_defined? ivar
instance_variable_get ivar
else
singleton_class.send name
end
end
end
val
end
if instance_reader
remove_possible_method name
define_method(name) do
if instance_variable_defined?(ivar)
instance_variable_get ivar
else
self.class.public_send name
end
end
define_method("#{name}?") { !!public_send(name) } if instance_predicate
end
attr_writer name if instance_writer
end
end
|