This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Listening for Changes to a Class (written by Phil Tomson) | ||
|---|---|---|
| Code | Expected | Actual |
class Tracker
def important
"This is an important method!"
end
def self.method_added sym
if sym == :important
raise 'The "important" method has been redefined!'
else
puts %{Method "#{sym}" was (re)defined.}
end
end
def self.method_removed sym
if sym == :important
raise 'The "important" method has been removed!'
else
puts %{Method "#{sym}" was removed.}
end
end
def self.method_undefined sym
if sym == :important
raise 'The "important" method has been undefined!'
else
puts %{Method "#{sym}" was removed.}
end
end
end
class Tracker
def new_method
'This is a new method.'
end
end |
Method "new_method" was (re)defined. |
Method "new_method" was (re)defined. |
class Tracker undef :important end |
RuntimeError: The "important" method has been undefined! ... |
RuntimeError: The "important" method has been undefined! from (irb):21:in `method_undefined' from (irb):33 |
class Module
alias_method :include_no_hook, :include
def include(*modules)
# Run the old implementation.
include_no_hook(*modules)
# Then run the hook.
modules.each do |mod|
self.include_hook mod
end
end
def include_hook
# Do nothing by default, just like Module#method_added et al.
# This method must be overridden in a subclass to do something useful.
end
end
class Tracker
def self.include_hook mod
puts %{"#{mod}" was included in #{self}.}
end
end
class Tracker
include Enumerable
end |
"Enumerable" was included in Tracker. |
"Enumerable" was included in Tracker. |