docs: function(request, urlVar, urlVal, params) {
  
          var matched     = -1
              , _param    = urlVar.match(/\:\w+/g)
              , regex     = null
              , tested    = false;
  
          if (!_param.length) return false;
  
          //  if custom path, path rewrite
          if (request.routing.param.path) {
              regex = new RegExp(urlVar, 'g')
              if ( regex.test(request.routing.param.path) ) {
                  request.routing.param.path = request.routing.param.path.replace(regex, urlVal);
              }
          }
  
          //  if custom file, file rewrite
          if (request.routing.param.file) {
              regex = new RegExp(urlVar, 'g')
              if ( regex.test(request.routing.param.file) ) {
                  request.routing.param.file = request.routing.param.file.replace(regex, urlVal);
              }
          }
  
          if (_param.length == 1) {// fast one
              matched =  ( _param.indexOf(urlVar) > -1 ) ? _param.indexOf(urlVar) : false;
  
              if (matched === false) return matched;
              // filter on method
              if (params.method !== request.method) return false;
  
              var key = _param[matched].substr(1);
              regex   = params.requirements[key];
  
              if ( /^\//.test(regex) ) {
                  var re      = regex.match(/\/(.*)\//).pop()
                      , flags = regex.replace('/'+ re +'/', '');
  
                  tested = new RegExp(re, flags).test( urlVal )
  
              } else {
                  tested = new RegExp(params.requirements[key]).test( urlVal )
              }
  
              if (
                  typeof(params.param[key]) != 'undefined' &&
                  typeof(params.requirements) != 'undefined' &&
                  typeof(params.requirements[key]) != 'undefined' &&
                  tested
              ) {
                  request.params[key] = urlVal;
                  return true
              }
  
          } else { // slow one
  
              // In order to support rules defined like :
              //      { params.url }  => `/section/:name/page:number`
              //      { request.url } => `/section/plante/page4`
              //
              //      with keys = [ ":name", ":number" ]
  
              var keys        = _param
                  , tplUrl    = params.url
                  , url       = request.url
                  , values    = {}
                  , strVal    = ''
                  , started   = false
                  , i         = 0;
  
              for (var c = 0, posLen = url.length; c < posLen; ++c) {
                  if (url.charAt(c) == tplUrl.charAt(i) && !started) {
                      ++i
                      continue
                  } else if (strVal == '') { // start
  
                      started = true;
                      strVal += url.charAt(c);
                  } else if ( c > (tplUrl.indexOf(keys[0]) + keys[0].length) ) {
  
                      regex   = params.requirements[keys[0]];
                      urlVal  = strVal.substr(0, strVal.length);
  
                      if ( /^\//.test(regex) ) {
                          var re      = regex.match(/\/(.*)\//).pop()
                              , flags = regex.replace('/'+ re +'/', '');
  
                          tested = new RegExp(re, flags).test( urlVal )
  
                      } else {
                          tested = new RegExp(params.requirements[key]).test( urlVal )
                      }
  
                      if (tested) {
                          values[ keys[0].substr(1) ] = urlVal
                      } else {
                          return false
                      }
  
                      strVal =  '';
                      started = false;
                      i = (tplUrl.indexOf(keys[0]) + keys[0].length);
                      c -= 1;
  
                      keys.splice(0,1)
                  } else {
                      strVal += url.charAt(c);
                      ++i
                  }
  
                  if (c == posLen - 1 ) {
  
                      regex   = params.requirements[keys[0]];
                      urlVal  = strVal.substr(0, strVal.length);
  
                      if ( /^\//.test(regex) ) {
                          var re      = regex.match(/\/(.*)\//).pop()
                              , flags = regex.replace('/'+ re +'/', '');
  
                          tested = new RegExp(re, flags).test( urlVal )
  
                      } else {
                          tested = new RegExp(params.requirements[key]).test( urlVal )
                      }
  
                      if (tested) {
                          values[ keys[0].substr(1) ] = urlVal
                      } else {
                          return false
                      }
  
                  }
  
              }
  
              if (values.count() == keys.length) {
                  for (var key in values) {
                      request.params[key] = values[key];
                  }
                  return true
              }
  
          }
  
          return false
      }