Module: Configure::Macro

Defined in:
lib/configure/macro.rb

Defined Under Namespace

Modules: DefaultFactoryMethod

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(cls) ⇒ Object



3
4
5
# File 'lib/configure/macro.rb', line 3

def self.extended(cls)
  cls.extend DefaultFactoryMethod
end

Instance Method Details

#configure_macro(receiver_attribute, factory_method: nil, constructor: nil, &build_action) ⇒ Object Also known as: configure



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