docs: function(path) {
  		var newProps = route.deparam(path),
  			oldProps = route.deparam(getCurrentUrl()),
  			method = "pushState",
  			changed = {};
  
  		// Adds window.location.hash to path if it's not already in path.
  		if (this.keepHash && path.indexOf("#") === -1 && window.location.hash) {
  			path += window.location.hash;
  		}
  
  		// The old state and new state are diffed 
  		// to figure out which keys are changing.
  		diffObject(oldProps, newProps)
  			.forEach(function(patch) {
  				// `patch.key` refers to the mutated property name on `newProps`.
  				return changed[patch.key] = true;
  			});
  
  		// If any of the changed properties are in `replaceStateKeys` or 
  		// `replaceStateOnceKeys` change the method to `'replaceState'`.
  		if (this.replaceStateKeys.length) {
  			this.replaceStateKeys.forEach(function(replaceKey) {
  				if (changed[replaceKey]) {
  					method = "replaceState";
  				}
  			});
  		}
  		
  		if (this.replaceStateOnceKeys.length) {
  			this.replaceStateOnceKeys
  				.forEach(function(replaceOnceKey, index, thisArray) {
  					if (changed[replaceOnceKey]) {
  						method = "replaceState";
  						// Remove so we don't attempt to replace 
  						// the state on this key again.
  						thisArray.splice(index, 1);
  					}
  				});
  		}
  		window.history[method](null, null, bindingProxy.call("root") + path);
  	}