If you are not very careful, monkeypatching could be very harmful. One thing to remember is that you should never override a method to add funcionality, for those kind of thinks you must use alias chain method pattern, a safer way of doing that.
For the rest of the monkeypatching, i.e. add new methods, you could debug them really easy with something like this:
class Class def method_added(method_name) puts "#{method_name} added to #{self}, callstack:" puts caller.map{|line| "\t#{line}" }.join("\n") end end |
You can always add more code to filter by class or by method’s name. Let’s see an example:
$ more example.rb require 'date' require 'time' class Class def method_added(method_name) return if %w(method_added).include? method_name.to_s puts "#{method_name} added to #{self}, callstack:" puts caller.map{|line| "\t#{line}" }.join("\n") end end class Time def to_date Date.ordinal self.year, self.yday end end class Date def to_time Time.parse self.to_s end end raise "to_date not working" unless Time.now.to_date == Date.today raise "to time not working" unless Time.now.to_date.to_time == Date.today.to_time |
The output will be:
$ ruby example.rb to_date added to Time, callstack: example.rb:13 to_time added to Date, callstack: example.rb:19
Nice, isn’t it?. Remember to be carefull with your monkeypatching, with great power comes great responsibility, it’s just a tool, neither magic nor the panacea.