Module: Basepack::Delegation::ClassMethods

Defined in:
lib/basepack/delegation.rb

Instance Method Summary collapse

Instance Method Details

#attr_default(attr, if_args = [], &block) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
# 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) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 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