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