class Object def chain_method(with_symbol, &new_method) old_method = method with_symbol eigenclass = class << self; self; end eigenclass.class_eval do define_method with_symbol do |*args| new_method[old_method, *args] end end end end def foo(arg) print 'in foo: ', arg, "\n" end puts foo 'first call' chain_method :foo do |old_method, arg | puts 'in first block_eval' old_method.call arg end puts foo 'second call' chain_method :foo do |old_method, arg| puts 'in second block_eval' old_method.call arg end puts foo 'third call'