Module: DelegateWhenNil

Defined in:
lib/delegate_when_nil.rb,
lib/delegate_when_nil/version.rb

Constant Summary collapse

VERSION =
"0.0.2"

Instance Method Summary collapse

Instance Method Details

#delegate_when_nil(*names) ⇒ Object

Child defines accessor :name Parent defines accessor :name

class Child

delegate_when_nil :name, :address, to: :parent, prefix: :get

# equivalent to
def get_name
  self.name || (parent && parent.get_name)
end

use #stop option to avoid prefix on parent (delegation “stops” at parent)

class Child

delegate_when_nil :name, :address, to: :parent, prefix: :get, stop: true

# equivalent to
def get_name
  self.name || (parent && parent.name) # #name directly on parent instead of #get_name
end


25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/delegate_when_nil.rb', line 25

def delegate_when_nil *names
  opts     = names.pop
  raise "please provide a hash with keys :to and :prefix as last argument" unless opts.is_a?(Hash) && opts.key?(:to) && opts.key?(:prefix)

  fallback = opts[:to]
  prefix   = opts[:prefix]
  stop     = opts[:stop]

  raise "prefix required to avoid infinite recursion in #attr_fallback #{names.inspect}" unless prefix

  names.each { |name|
    myname = [prefix, name].compact.join('_')
    fbname = stop ? name : myname
    class_eval "def #{myname}(*args) ; self.#{name}(*args) || (#{fallback} && #{fallback}.#{fbname}(*args)) ; end"
  }
end