code: function crossing(nameMatcher, ignoreTrailingSlash) {
      if (!(this instanceof crossing)) {
        throw new Error('Crossing can not be called without instatiation. Please use "new Crossing()" instead');
      }
      this._urls = {};
      this._compiled = {};
      this._lastHash = '';
      this._ignoreTrailingSlash = !!ignoreTrailingSlash;
      if (nameMatcher) {
        this._nameMatcher = nameMatcher;
      } else {
        this._nameMatcher = new RegExp('<([a-zA-Z0-9-_%]{1,})>', 'g');
      }
  
      this._getArgs = function(urlName, path) {
        var args = {};
        var valueMatches = path.match(this._compiled[urlName]);
        var i=0;
        var match = this._nameMatcher.exec(this._urls[urlName]);
        while(match && match.length === 2 && valueMatches.length + 1 > i) {
          var arg = match[1];
          args[arg] = valueMatches[++i];
          match = this._nameMatcher.exec(this._urls[urlName]);
        }
        return args;
      };
  
      this._getName = function(path) {
        if (!path) {
          return;
        }
        for (var url in this._compiled) {
          if (path.match(this._compiled[url])) {
            return url;
          }
        }
        return;
      };
    }
docs: Provides utilities to deal with website/app urls. Provides functionality for deep-linking Ajax calls, and a url mapper to generate dynamic urls.