module DelegateWhenNil

Constants

VERSION

Public Instance Methods

delegate_when_nil(*names) click to toggle source

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
# 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