wepaste

module Magic
  class Mock
    def self.method instance, method_name, &new_method
      mock_alias = Class.new
      (instance.methods).each do |method|
        mock_alias.send(:define_method, method) do |*args|
          instance.send(method, *args)
        end
      end
      mock = Class.new(mock_alias) do
        define_method(method_name, &new_method)
      end
      mock.new
    end
  end
end

# usage
hello = "hello"
mock = Magic::Mock.method(hello , :to_s) do
  super + " from mock"
end
puts mock.to_s # hello from mock
puts hello.to_s # hello