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
|
# File 'lib/configure/macro.rb', line 7
def configure_macro(receiver_attribute, factory_method: nil, constructor: nil, &build_action)
unless constructor.nil?
factory_method = constructor
end
factory_method ||= default_factory_method
singleton_class.class_exec receiver_attribute, factory_method do |receiver_attribute, factory_method|
unless build_action.nil?
define_method factory_method do |*args, **keyword_args|
if args.empty?
build_action.()
elsif keyword_args.empty?
build_action.(*args)
else
build_action.(*args, **keyword_args)
end
end
end
define_method :configure do |receiver, *args, attr_name: nil, **keyword_args|
if receiver.is_a?(Symbol) && attr_name.nil? && args.empty? && keyword_args.empty?
return super receiver
end
attr_name ||= receiver_attribute
if keyword_args.empty?
instance = public_send factory_method, *args
else
instance = public_send factory_method, *args, **keyword_args
end
receiver.public_send "#{attr_name}=", instance
instance
end
end
end
|