module Configure::Macro

Public Class Methods

extended(cls) click to toggle source
# File lib/configure/macro.rb, line 3
def self.extended(cls)
  cls.extend DefaultFactoryMethod
end

Public Instance Methods

configure(receiver_attribute, factory_method: nil, constructor: nil, &build_action)
Alias for: configure_macro
configure_macro(receiver_attribute, factory_method: nil, constructor: nil, &build_action) click to toggle source
Calls superclass method
# 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
Also aliased as: configure