     this.visit = (url, options, callback)->
       if typeof options is "function"
         [callback, options] = [options, null]
-      else if options
-        restore = {}
-        [restore[k], @[k]] = [@[k], v] for k,v of options
-      @on "error", (error)->
-        @removeListener "error", arguments.callee
-        @[k] = v for k,v of restore if restore
-        callback error
-      history._assign url
-      window.document.addEventListener "DOMContentLoaded", =>
-        @removeListener "error", arguments.callee
-        @[k] = v for k,v of restore if restore
-        @wait callback
+      @withOptions options, (reset)=>
+        @on "error", (error)->
+          @removeListener "error", arguments.callee
+          reset()
+          callback error
+        history._assign url
+        window.document.addEventListener "DOMContentLoaded", =>
+          @removeListener "error", arguments.callee
+          reset()
+          @wait callback
       return
 
     # ### browser.location => Location

    # True to have Zombie report what it's doing.
    @debug = false

    if options
      for k,v of options
        @[k] = v if @OPTIONS.indexOf(k) >= 0

    #
    # Fire a DOM event.  You can use this to simulate a DOM event, e.g. clicking a
    # link.  These events will bubble up and can be cancelled.  With a callback, this
    # method will call `wait`.
    #
    # * name -- Even name (e.g `click`)
    # * target -- Target element (e.g a link)
