module Marshal
  class << self
    def dump_with_mocks(*args)
      object = args.shift
      return dump_without_mocks(*args.unshift(object)) unless object.instance_variable_defined?(:@mock_proxy)

      mp = object.instance_variable_get(:@mock_proxy)
      return dump_without_mocks(*args.unshift(object)) unless mp.is_a?(::RSpec::Mocks::Proxy)

      object.__send__(:remove_instance_variable, :@mock_proxy)

      begin
        dump_without_mocks(*args.unshift(object.dup))
      ensure
        object.instance_variable_set(:@mock_proxy,mp)
      end
    end

    alias_method :dump_without_mocks, :dump
    undef_method :dump
    alias_method :dump, :dump_with_mocks
  end
end
