module Basepack::Delegation::ClassMethods

Public Instance Methods

attr_default(attr, if_args = [], &block) click to toggle source
# File lib/basepack/delegation.rb, line 50
def attr_default(attr, if_args = [], &block)
  delegated = "#{attr}_delegated".to_sym
  if_args = if_args.map {|a| "@#{a}".to_sym }

  define_method "#{attr}!" do
    val = send(delegated)
    if val.nil? or if_args.any? {|a| instance_variable_defined?(a) }
      instance_eval(&block)
    else
      val # no argument redefined, return delegate
    end
  end
end
delegate_attrs(*attrs_names) click to toggle source
# File lib/basepack/delegation.rb, line 6
def delegate_attrs(*attrs_names)
  options = attrs_names.last.is_a?(Hash) ? attrs_names.pop : {}
  to = options[:to] || :delegate

  attrs_names.each do |attr|
    if attr[-1] == "?"
      writter = attr[0...-1]
      define_method attr do
        send(writter)
      end
    else
      writter = attr
    end

    var = "@#{writter}".to_sym
    default = "#{writter}!".to_sym
    delegated = "#{writter}_delegated".to_sym

    attr_writer writter

    define_method writter do |&block|
      if block
        instance_variable_set(block)
      else
        if instance_variable_defined?(var)
          val = instance_variable_get(var)
          val.is_a?(Proc) ? instance_eval(&val) : val
        else
          send(default)
        end
      end
    end

    define_method delegated do
      d = send(to)
      d.respond_to?(attr) ? d.public_send(attr) : nil
    end

    define_method default do
      send(delegated)
    end
  end
end