def inheritor( key, obj, op=nil )
op = op ? op.to_sym : :add
instance_variable_set("@#{key}", obj)
deflambda = lambda do
define_method( key ) do
defined?(super) ? super.__send__(op,obj) : obj.dup
end
define_method( "#{key}!" ) do
instance_variable_get("@#{key}") || inheritor( key, obj.class.new, op )
end
end
if self == Class or self == Module
class_eval &deflambda
elsif is_a?(Class)
(class << self; self; end).class_eval &deflambda
elsif is_a?(Module)
extend class_extension( &deflambda )
else
(class << self; self; end).class_eval &deflambda
end
obj
end