Module: Amenable

Extended by:
Amenable
Included in:
Amenable
Defined in:
lib/amenable.rb,
lib/amenable/version.rb

Constant Summary collapse

VERSION =
'0.1.0'

Instance Method Summary collapse

Instance Method Details

#call(fn, *args, **kwargs, &block) ⇒ Object



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

def call(fn, *args, **kwargs, &block)
  unless fn.is_a?(Method) || fn.is_a?(Proc)
    raise ArgumentError, "expecting type Method or Proc, found: #{fn.class}"
  end

  rest = keyrest = false
  params = []
  keys = []

  fn.parameters.each do |type, name|
    case type
    when :req, :opt
      params << name
    when :key, :keyreq
      keys << name
    when :rest
      rest = true
    when :keyrest
      keyrest = true
    end
  end

  # remove excessive args
  args = args.slice(0, params.count) unless rest

  if !keys.empty? || keyrest
    # remove excessive keywords
    kwargs = kwargs.slice(*keys) unless keyrest
    fn.call(*args, **kwargs, &block)
  else
    fn.call(*args, &block)
  end
end