Module: Forwardable::Extended

Defined in:
lib/forwardable/extended.rb,
lib/forwardable/extended/version.rb

Constant Summary collapse

DEF_DELEGATOR =
Object::Forwardable.instance_method(:def_delegator)
VERSION =
"2.2.0"

Instance Method Summary collapse

Instance Method Details

#def_delegator(accessor, method, alias_ = method, **kwd) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/forwardable/extended.rb', line 41

def def_delegator(accessor, method, alias_ = method, **kwd)
  kwd, alias_ = alias_, method if alias_.is_a?(Hash) && !kwd.any?

  if alias_.is_a?(Hash) || !kwd.any?
    DEF_DELEGATOR.bind(self).call(
      accessor, method, alias_
    )

  elsif kwd[:type]
    raise ArgumentError, "Alias not supported with type; the method is the alias" if alias_ != method
    send("def_#{kwd[:type]}_delegator", accessor, method, **kwd.tap { |obj|
      obj.delete(:type)
    })

  else
    def_modern_delegator(
      accessor, method, alias_, **kwd
    )
  end
end

#def_hash_delegator(hash, method, key: method, bool: false, wrap: false) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/forwardable/extended.rb', line 11

def def_hash_delegator(hash, method, key: method, bool: false, wrap: false)
  prefix = (bool == :reverse ? "!!!" : "!!") if bool
  wrap = "self.class.new" if wrap.is_a?(TrueClass)
  wrap = wrap ? "#{wrap} " : ""
  suffix = (bool ? "?" : "")

  class_eval "    def \#{method}\#{suffix}\n      \#{wrap}\#{prefix}\#{hash}[\#{key.inspect}]\n    end\n  STR\nend\n", __FILE__, __LINE__

#def_ivar_delegator(ivar, alias_ = ivar, bool: false, wrap: false) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/forwardable/extended.rb', line 26

def def_ivar_delegator(ivar, alias_ = ivar, bool: false, wrap: false)
  prefix = (bool == :reverse ? "!!!" : "!!") if bool
  wrap = "self.class.new" if wrap.is_a?(TrueClass)
  wrap = wrap ? "#{wrap} " : ""
  suffix = (bool ? "?" : "")

  class_eval "    def \#{alias_.to_s.gsub(/\\A@/, \"\")}\#{suffix}\n      \#{wrap}\#{prefix}\#{ivar}\n    end\n  STR\nend\n", __FILE__, __LINE__

#def_modern_delegator(accessor, method, alias_ = method, args: [], bool: false, wrap: false) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/forwardable/extended.rb', line 64

def def_modern_delegator(accessor, method, alias_ = method, args: [], bool: false, wrap: false)
  args = [args].flatten.compact.map(&:to_s).unshift("").join(", ")
  prefix = (bool == :reverse ? "!!!" : "!!") if bool
  wrap = "self.class.new" if wrap.is_a?(TrueClass)
  wrap = wrap ? "#{wrap} " : ""
  suffix = (bool ? "?" : "")

  class_eval "    def \#{alias_}\#{suffix}(*args, &block)\n      \#{wrap}\#{prefix}\#{accessor}.send(\#{method.inspect}\#{args + \", *args\"}, &block)\n    end\n  STR\nend\n", __FILE__, __LINE__