module Sabrina::ChildrenManager::AttrChildren

Adds a macro for attribute with children update.

Private Instance Methods

attr_children(*args) click to toggle source

Takes any number of symbols and creates accessors that will also pass the value down to each value in children.

# File lib/sabrina/children_manager.rb, line 29
def attr_children(*args)
  attr_reader(*args)
  attr_writer_children(*args)
end
attr_writer_children(*args) click to toggle source

Takes any number of symbols and creates writers that will also pass the value down to each value in children.

# File lib/sabrina/children_manager.rb, line 16
def attr_writer_children(*args)
  args.each do |x|
    x_var = "@#{x}".to_sym
    x_setter = "#{x}=".to_sym

    lamb = generate_writer_children(x_setter, x_var)

    define_method(x_setter, lamb) unless respond_to?(x_setter)
  end
end
generate_writer_children(name, variable) click to toggle source
# File lib/sabrina/children_manager.rb, line 34
def generate_writer_children(name, variable)
  lambda do |value|
    children.each do |c|
      next c.method(name).call(value) if c.respond_to?(name)
      fail "Child #{c} has no method #{name}, yet attr_children called."
    end
    instance_variable_set(variable, value)
  end
end