Module: Dry::Cerberus

Defined in:
lib/dry/behaviour/cerberus.rb

Constant Summary collapse

POSTPONE_FIX_CLAUSES =
lambda do |guarded|
  TracePoint.new(:end) do |tp|
    if tp.self == guarded
      H.umbrellas(guarded)
      tp.disable
    end
  end.enable
end

Instance Method Summary collapse

Instance Method Details

#guarded_methodsObject



14
15
16
# File 'lib/dry/behaviour/cerberus.rb', line 14

def guarded_methods
  @guarded_methods ||= {}
end

#method_added(name) ⇒ Object

[:req, :p], [:opt, :po], [:rest, :a], [:key, :when], [:keyrest, :b], [:block, :cb]


19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/dry/behaviour/cerberus.rb', line 19

def method_added(name)
  return if @adding_alias

  m = instance_method(name)
  key = m.parameters.any? { |(k, v)| k == :key && v == :when } ? H.extract_when(m) : m.arity
  key = case key
        when String then instance_eval(key)
        when -Float::INFINITY...0 then nil
        else key
        end
  (guarded_methods[name] ||= {})[key] = m

  @adding_alias = true
  alias_name = H.alias_name(m, guarded_methods[name].size.pred)
  alias_method alias_name, name
  private alias_name
  @adding_alias = false
end