Module: ArgsToAttrs::InstanceMethods

Defined in:
lib/args_to_attrs.rb

Instance Method Summary collapse

Instance Method Details

#args_to_attrs!(expand_keyrest: false) ⇒ Object



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
# File 'lib/args_to_attrs.rb', line 10

def args_to_attrs!(expand_keyrest: false)
  arguments = Array.new
  rest_keyword_args = {}
  method_name = self.eval('__method__') or raise OutOfMethodError
  receiver.method(method_name).parameters.each do |kind, name|
    case kind
    when :key, :keyreq, :req, :opt
      arguments << name
    when :keyrest
      next unless expand_keyrest
      rest_keyword_args = self.local_variable_get(name)
      arguments = arguments.union(rest_keyword_args.keys)
    when :rest
      fail ArgumentForwardingNotSupportedError if name == :*
    end
  end
  assignment_order = block_given? ? yield(arguments.to_a) : arguments
  assignment_order.each do |name|
    value = rest_keyword_args.fetch(name) { self.local_variable_get(name) }
    method_name = :"#{name}="
    if receiver.class.private_method_defined?(method_name) ||
      receiver.class.public_method_defined?(method_name) ||
      receiver.class.protected_method_defined?(method_name)
      receiver.send(method_name, value)
    else
      receiver.instance_variable_set(:"@#{name}", value)
    end
  end
  true
end