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