From: Markus n/a Date: 2013-01-03T00:40:28+09:00 Subject: Re: temporarily override a methode found a way class Tee def self.tee(logfile, append = true, stdout = true, stderr = true) file = File.open(logfile, append ? 'a' : 'w+') stdout_write = nil stderr_write = nil stdout_write = decorate($stdout, :write) {|data| file.write(data)} if stdout stderr_write = decorate($stderr, :write) {|data| file.write(data)} if stderr begin yield if block_given? ensure restore($stdout, :write, stdout_write) if not stdout_write.nil? restore($stderr, :write, stderr_write) if not stderr_write.nil? file.close end end private def self.restore(obj, methodname, method) class << obj self end.module_eval do define_method(methodname, method) end end def self.decorate(obj, methodname) method = obj.method(methodname) class << obj self end.module_eval do define_method(methodname) do |data| method.call(data) yield data end end return method end end -- Posted via http://www.ruby-forum.com/.