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)
CodeExpectedActual
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.