From: transfire@... Date: 2006-07-14T14:17:39+09:00 Subject: Re: Preferred monkeypatching technique Daniel DeLorme wrote: > Tom Werner wrote: > > Allow me to present a scenario: > > > > class Firetruck > > def put_out_fire(options = {}) > > # code > > end > > end > > Here's what I'd do to keep it clean: > > module FastFiretruck > def initialize(*args) > super > self.extend FastFiretruck::Obj > end > module Obj > def put_out_fire(options = {}) > super({:fast => "please!"}.merge(options)) > end > end > end > Firetruck.class_eval{ include FastFiretruck } Hey, thanks Daniel! You actaully led me to a new potential approach. Here, try this: class Module def monkey_patch(mod) _new = method(:new) _allocate = method(:allocate) (class << self; self; end).class_eval do define_method(:new) do |*args| o = _new.call(*args) o.extend mod o end define_method(:allocate) do |*args| o = _allocate.call(*args) o.extend mod o end end end end # EXAMPLE class Firetruck def put_out_fire(options = {}) "put out #{options}" end end module FastFiretruck def put_out_fire(options = {}) super({:fast => "please!"}.merge(options)) end end Firetruck.monkey_patch(FastFiretruck) ft = Firetruck.new p ft.put_out_fire T.