Ara and Pit are impressive meta-coders indeed. Think Ara might even
have a Prototype lib
you'd enjoy.
BTW, if we were all good little scouts and always modularized our code
one could use:
class Module
# Prepend an "aspect" module to a module.
#
# module X
# def x; "x"; end
# end
#
# module U
# def x; '{' + super + '}'; end
# end
#
# X.prepend U
#
# X.x # => "{x}"
def prepend( aspect )
aspect.send
include, self)
extend aspect
end
end
Another trick for common injuns:
class Class
# Prepend an "aspect" module to a class.
#
# class Firetruck
# def put_out_fire(option)
# "Put out #{option}"
# end
# end
#
# module FastFiretruck
# def put_out_fire(option)
# super("very #{option}!")
# end
# end
#
# Firetruck.prepend(FastFiretruck)
#
# ft = Firetruck.new
# ft.put_out_fire('fast') #=> "Put out very fast!"
def prepend( aspect )
_new = method
new)
_allocate = method
allocate)
(class << self; self; end).class_eval do
define_method
new) do |*args|
o = _new.call(*args)
o.extend aspect
o
end
define_method
allocate) do |*args|
o = _allocate.call(*args)
o.extend aspect
o
end
end
end
end
Albeit that has some unfortunate shortcomings.
T.