Module: Delivered::Signature

Defined in:
lib/delivered/signature.rb

Constant Summary collapse

NULL =
Object.new

Instance Method Summary collapse

Instance Method Details

#sig(*sig_args, returns: NULL, **sig_kwargs) ⇒ Object



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

def sig(*sig_args, returns: NULL, **sig_kwargs)
  meta = class << self; self; end
  meta.send :define_method, :method_added do |name|
    meta.send :remove_method, :method_added

    alias_method :"__#{name}", name
    define_method name do |*args, **kwargs, &block|
      sig_args.each.with_index do |arg, i|
        args[i] => ^arg
      end

      kwargs.each do |key, value|
        value => ^(sig_kwargs[key])
      end

      result = if block
                 send(:"__#{name}", *args, **kwargs, &block)
               else
                 send(:"__#{name}", *args, **kwargs)
               end

      result => ^returns if returns != NULL

      result
    end
  end
end