module Construqt::Util::Chainable

Public Class Methods

chainable_attr(clazz, arg, set_value = true, init = false, aspect = lambda{|i|}) click to toggle source
# File lib/construqt/util.rb, line 31
def self.chainable_attr(clazz, arg, set_value = true, init = false, aspect = lambda{|i|})
  instance_variable_name = "@#{arg}".to_sym
  #      puts ">>>chainable_attr #{"%x"%self.object_id} init=#{init}"
  #      self.instance_variable_set(instance_variable_name, init)
  #puts "self.chainable_attr #{clazz.name} #{arg.to_sym} #{set_value} #{init}"
  clazz.send("define_method", arg.to_sym) do |*args|
    instance_eval(&aspect)
    self.instance_variable_set(instance_variable_name, args.length>0 ? args[0] : set_value)
    self
  end

  if ((set_value.kind_of?(true.class) || set_value.kind_of?(false.class)) &&
      (init.kind_of?(true.class) || init.kind_of?(false.class)))
    get_name = "#{arg}?"
  else
    get_name = "get_#{arg}"
  end

  get_name_proc = Proc.new do
    unless self.instance_variables.include?(instance_variable_name)
      #puts "init #{get_name} #{instance_variable_name} #{defined?(instance_variable_name)} #{set_value} #{init}"
      self.instance_variable_set(instance_variable_name, init)
    end

    ret = self.instance_variable_get(instance_variable_name)
    #puts "#{self.class.name} #{get_name} #{set_value} #{init} => #{ret.inspect}"
    ret
  end

  clazz.send("define_method", get_name, get_name_proc)
end
chainable_attr_value(clazz, arg, init = nil) click to toggle source
# File lib/construqt/util.rb, line 18
def self.chainable_attr_value(clazz, arg, init = nil)
  instance_variable_name = "@#{arg}".to_sym
  self.instance_variable_set(instance_variable_name, init)
  define_method(arg.to_s) do |val|
    self.instance_variable_set(instance_variable_name, val)
    self
  end

  define_method("get_#{arg}") do
    self.instance_variable_get(instance_variable_name.to_sym)
  end
end
included(other) click to toggle source
# File lib/construqt/util.rb, line 5
def self.included(other)
  #puts "Chainable #{other.name}"
  other.class.send("define_method", "chainable_attr") do |*args|
    #puts "chainable_attr:#{self.name} #{args.inspect}"
    Chainable.chainable_attr(self, *args)
  end

  other.class.send("define_method", "chainable_attr_value") do |*args|
    #puts "chainable_attr_value:#{self.name} #{args.inspect}"
    Chainable.chainable_attr_value(self, *args)
  end
end