# Trap all method definitions.
#
# Copyright (c) 2001, 2002 Robert Feldt, robert_feldt@computer.org
#
$method_def_handlers = Array.new
def trap_method_definitions(aProc)
$method_def_handlers.push aProc unless $method_def_handlers.include?(aProc)
end
def untrap_method_definitions(aProc)
$method_def_handlers.delete aProc
end
class Object
def Object.method_added(id)
$method_def_handlers.each do |p|
p.call(id, self)
end
end
@@defining_method_added = false
@@defining_singleton_method_added = false
# deep magic so that we are reasonably sticky. We won't be notified
# if Object.singleton_method_added is overridden though. I haven't
# found away around that. Please mail me if you do!
def Object.singleton_method_added(methodId)
if methodId == :method_added
if @@defining_method_added
@@defining_method_added = false
else
@@defining_method_added = true
self.instance_eval <<-'EOC'
alias new_method_added method_added
def method_added(id)
new_method_added(id)
$method_def_handlers.each do |p|
p.call(id, self)
end
end
EOC
end
end
end
end
syntax highlighted by Code2HTML, v. 0.9.1