docs: function (fragment, createHistoryEntry, triggerRoute, force, callback) {
  
              var self = this;
  
              if (!callback && createHistoryEntry instanceof Function) {
                  callback = createHistoryEntry;
                  createHistoryEntry = null;
              }
  
              if (!callback && triggerRoute instanceof Function) {
                  callback = triggerRoute;
                  triggerRoute = null;
              }
  
              if (!callback && force instanceof Function) {
                  callback = force;
                  force = null;
              }
  
              if (createHistoryEntry == undefined || createHistoryEntry === null) {
                  createHistoryEntry = true;
              }
  
              if (triggerRoute == undefined || triggerRoute === null) {
                  triggerRoute = true;
              }
  
              var eventData = {
                  fragment: fragment,
                  createHistoryEntry: createHistoryEntry,
                  triggerRoute: triggerRoute
              };
  
              var urlChange = this._getFragment() !== fragment;
  
              if (!urlChange && !force) {
                  callback && callback();
                  return;
              }
  
              this.trigger(History.EVENTS.NAVIGATION_START, eventData);
              this.$processUrl = urlChange;
  
              if (createHistoryEntry) {
                  if (this.runsInBrowser()) {
                      if (this.$.useState) {
  
                          console.log("Pushing " + fragment + " to history");
  
                          window.history.pushState({
                              fragment: "/" + fragment
                          }, null, this.$.baseUrl + fragment);
                      } else {
                          window.location.hash = "/" + encodeURI(fragment);
                      }
                  } else {
                      this.checkUrl(null);
                  }
                  this.$history.push(fragment);
              } else {
                  if (this.runsInBrowser()) {
  
                      if (this.$.useState) {
  
                          console.log("Replacing " + fragment + " to history");
  
                          window.history.replaceState({
                              fragment: "/" + fragment
                          }, null, this.$.baseUrl + fragment);
                      } else {
                          // replace hash
                          window.location.replace("#/" + fragment);
                      }
                  }
                  this.$history[this.$history.length - 1] = fragment;
              }
  
              this.$processUrl = true;
  
              if(this.$fragment !== fragment){
                  this.$fragment = fragment;
                  this.trigger('change:fragment', this.$fragment);
              }
  
              if (triggerRoute) {
                  this.triggerRoute(fragment, function() {
                      self.trigger(History.EVENTS.NAVIGATION_COMPLETE, eventData);
                      if (callback) {
                          callback.apply(self, arguments);
                      }
                  });
              } else {
                  this.trigger(History.EVENTS.NAVIGATION_COMPLETE, eventData);
              }
          }