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) = attrs_names.last.is_a?(Hash) ? attrs_names.pop : {} to = [: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 |