function URL(address, location, parser) {
	  if (!(this instanceof URL)) {
	    return new URL(address, location, parser);
	  }
	
	  var relative, extracted, parse, instruction, index, key
	    , instructions = rules.slice()
	    , type = typeof location
	    , url = this
	    , i = 0;
	
	  //
	  // The following if statements allows this module two have compatibility with
	  // 2 different API:
	  //
	  // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments
	  //    where the boolean indicates that the query string should also be parsed.
	  //
	  // 2. The `URL` interface of the browser which accepts a URL, object as
	  //    arguments. The supplied object will be used as default values / fall-back
	  //    for relative paths.
	  //
	  if ('object' !== type && 'string' !== type) {
	    parser = location;
	    location = null;
	  }
	
	  if (parser && 'function' !== typeof parser) parser = qs.parse;
	
	  location = lolcation(location);
	
	  //
	  // Extract protocol information before running the instructions.
	  //
	  extracted = extractProtocol(address);
	  relative = !extracted.protocol && !extracted.slashes;
	  url.slashes = extracted.slashes || relative && location.slashes;
	  url.protocol = extracted.protocol || location.protocol || '';
	  address = extracted.rest;
	
	  //
	  // When the authority component is absent the URL starts with a path
	  // component.
	  //
	  if (!extracted.slashes) instructions[2] = [/(.*)/, 'pathname'];
	
	  for (; i < instructions.length; i++) {
	    instruction = instructions[i];
	    parse = instruction[0];
	    key = instruction[1];
	
	    if (parse !== parse) {
	      url[key] = address;
	    } else if ('string' === typeof parse) {
	      if (~(index = address.indexOf(parse))) {
	        if ('number' === typeof instruction[2]) {
	          url[key] = address.slice(0, index);
	          address = address.slice(index + instruction[2]);
	        } else {
	          url[key] = address.slice(index);
	          address = address.slice(0, index);
	        }
	      }
	    } else if (index = parse.exec(address)) {
	      url[key] = index[1];
	      address = address.slice(0, index.index);
	    }
	
	    url[key] = url[key] || (
	      relative && instruction[3] ? location[key] || '' : ''
	    );
	
	    //
	    // Hostname, host and protocol should be lowercased so they can be used to
	    // create a proper `origin`.
	    //
	    if (instruction[4]) url[key] = url[key].toLowerCase();
	  }
	
	  //
	  // Also parse the supplied query string in to an object. If we're supplied
	  // with a custom parser as function use that instead of the default build-in
	  // parser.
	  //
	  if (parser) url.query = parser(url.query);
	
	  //
	  // If the URL is relative, resolve the pathname against the base URL.
	  //
	  if (
	      relative
	    && location.slashes
	    && url.pathname.charAt(0) !== '/'
	    && (url.pathname !== '' || location.pathname !== '')
	  ) {
	    url.pathname = resolve(url.pathname, location.pathname);
	  }
	
	  //
	  // We should not add port numbers if they are already the default port number
	  // for a given protocol. As the host also contains the port number we're going
	  // override it with the hostname which contains no port number.
	  //
	  if (!required(url.port, url.protocol)) {
	    url.host = url.hostname;
	    url.port = '';
	  }
	
	  //
	  // Parse down the `auth` for the username and password.
	  //
	  url.username = url.password = '';
	  if (url.auth) {
	    instruction = url.auth.split(':');
	    url.username = instruction[0] || '';
	    url.password = instruction[1] || '';
	  }
	
	  url.origin = url.protocol && url.host && url.protocol !== 'file:'
	    ? url.protocol +'//'+ url.host
	    : 'null';
	
	  //
	  // The href is just the compiled result.
	  //
	  url.href = url.toString();
	}
/**
	 * The actual URL instance. Instead of returning an object we've opted-in to
	 * create an actual constructor as it's much more memory efficient and
	 * faster and it pleases my OCD.
	 *
	 * @constructor
	 * @param {String} address URL we want to parse.
	 * @param {Object|String} location Location defaults for relative paths.
	 * @param {Boolean|Function} parser Parser for the query string.
	 * @api public
	 */
The actual URL instance. Instead of returning an object we've opted-in to
create an actual constructor as it's much more memory efficient and
faster and it pleases my OCD.

@constructor
@param {String} address URL we want to parse.
@param {Object|String} location Location defaults for relative paths.
@param {Boolean|Function} parser Parser for the query string.
@api public
The actual URL instance . Instead of returning an object we ' ve opted - in to create an actual constructor as it ' s much more memory efficient and faster and it pleases my OCD . @constructor @param { String } address URL we want to parse . @param { Object|String } location Location defaults for relative paths . @param { Boolean|Function } parser Parser for the query string . @api public
function URL(address, location, parser) {
	  if (!(this instanceof URL)) {
	    return new URL(address, location, parser);
	  }
	  var relative, extracted, parse, instruction, index, key
	    , instructions = rules.slice()
	    , type = typeof location
	    , url = this
	    , i = 0;
	   The following if statements allows this module two have compatibility with
	   2 different API:
	   1. Node.js's `url.parse` api which accepts a URL, boolean as arguments
	      where the boolean indicates that the query string should also be parsed.
	   2. The `URL` interface of the browser which accepts a URL, object as
	      arguments. The supplied object will be used as default values / fall-back
	      for relative paths.
	  if ('object' !== type && 'string' !== type) {
	    parser = location;
	    location = null;
	  }
	  if (parser && 'function' !== typeof parser) parser = qs.parse;
	  location = lolcation(location);
	   Extract protocol information before running the instructions.
	  extracted = extractProtocol(address);
	  relative = !extracted.protocol && !extracted.slashes;
	  url.slashes = extracted.slashes || relative && location.slashes;
	  url.protocol = extracted.protocol || location.protocol || '';
	  address = extracted.rest;
	   When the authority component is absent the URL starts with a path
	   component.
	  if (!extracted.slashes) instructions[2] = [/(.*)/, 'pathname'];
	  for (; i < instructions.length; i++) {
	    instruction = instructions[i];
	    parse = instruction[0];
	    key = instruction[1];
	    if (parse !== parse) {
	      url[key] = address;
	    } else if ('string' === typeof parse) {
	      if (~(index = address.indexOf(parse))) {
	        if ('number' === typeof instruction[2]) {
	          url[key] = address.slice(0, index);
	          address = address.slice(index + instruction[2]);
	        } else {
	          url[key] = address.slice(index);
	          address = address.slice(0, index);
	        }
	      }
	    } else if (index = parse.exec(address)) {
	      url[key] = index[1];
	      address = address.slice(0, index.index);
	    }
	    url[key] = url[key] || (
	      relative && instruction[3] ? location[key] || '' : ''
	    );
	     Hostname, host and protocol should be lowercased so they can be used to
	     create a proper `origin`.
	    if (instruction[4]) url[key] = url[key].toLowerCase();
	  }
	   Also parse the supplied query string in to an object. If we're supplied
	   with a custom parser as function use that instead of the default build-in
	   parser.
	  if (parser) url.query = parser(url.query);
	   If the URL is relative, resolve the pathname against the base URL.
	  if (
	      relative
	    && location.slashes
	    && url.pathname.charAt(0) !== '/'
	    && (url.pathname !== '' || location.pathname !== '')
	  ) {
	    url.pathname = resolve(url.pathname, location.pathname);
	  }
	   We should not add port numbers if they are already the default port number
	   for a given protocol. As the host also contains the port number we're going
	   override it with the hostname which contains no port number.
	  if (!required(url.port, url.protocol)) {
	    url.host = url.hostname;
	    url.port = '';
	  }
	   Parse down the `auth` for the username and password.
	  url.username = url.password = '';
	  if (url.auth) {
	    instruction = url.auth.split(':');
	    url.username = instruction[0] || '';
	    url.password = instruction[1] || '';
	  }
	  url.origin = url.protocol && url.host && url.protocol !== 'file:'
	    ? url.protocol +''+ url.host
	    : 'null';
	   The href is just the compiled result.
	  url.href = url.toString();
	}
function URL ( address , location , parser ) { if ( ! ( this instanceof URL ) ) { return new URL ( address , location , parser ) ; } var relative , extracted , parse , instruction , index , key , instructions = rules . slice ( ) , type = typeof location , url = this , i = 0 ; if ( 'object' !== type && 'string' !== type ) { parser = location ; location = null ; } if ( parser && 'function' !== typeof parser ) parser = qs . parse ; location = lolcation ( location ) ; extracted = extractProtocol ( address ) ; relative = ! extracted . protocol && ! extracted . slashes ; url . slashes = extracted . slashes || relative && location . slashes ; url . protocol = extracted . protocol || location . protocol || '' ; address = extracted . rest ; if ( ! extracted . slashes ) instructions [ 2 ] = [ / (.*) / , 'pathname' ] ; for ( ; i < instructions . length ; i ++ ) { instruction = instructions [ i ] ; parse = instruction [ 0 ] ; key = instruction [ 1 ] ; if ( parse !== parse ) { url [ key ] = address ; } else if ( 'string' === typeof parse ) { if ( ~ ( index = address . indexOf ( parse ) ) ) { if ( 'number' === typeof instruction [ 2 ] ) { url [ key ] = address . slice ( 0 , index ) ; address = address . slice ( index + instruction [ 2 ] ) ; } else { url [ key ] = address . slice ( index ) ; address = address . slice ( 0 , index ) ; } } } else if ( index = parse . exec ( address ) ) { url [ key ] = index [ 1 ] ; address = address . slice ( 0 , index . index ) ; } url [ key ] = url [ key ] || ( relative && instruction [ 3 ] ? location [ key ] || '' : '' ) ; if ( instruction [ 4 ] ) url [ key ] = url [ key ] . toLowerCase ( ) ; } if ( parser ) url . query = parser ( url . query ) ; if ( relative && location . slashes && url . pathname . charAt ( 0 ) !== '/' && ( url . pathname !== '' || location . pathname !== '' ) ) { url . pathname = resolve ( url . pathname , location . pathname ) ; } if ( ! required ( url . port , url . protocol ) ) { url . host = url . hostname ; url . port = '' ; } url . username = url . password = '' ; if ( url . auth ) { instruction = url . auth . split ( ':' ) ; url . username = instruction [ 0 ] || '' ; url . password = instruction [ 1 ] || '' ; } url . origin = url . protocol && url . host && url . protocol !== 'file:' ? url . protocol + '//' + url . host : 'null' ; url . href = url . toString ( ) ; }
The actual URL instance.
The actual URL instance .
// // The following if statements allows this module two have compatibility with // 2 different API: // // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments //    where the boolean indicates that the query string should also be parsed. // // 2. The `URL` interface of the browser which accepts a URL, object as //    arguments. The supplied object will be used as default values / fall-back //    for relative paths. // // // Extract protocol information before running the instructions. // // // When the authority component is absent the URL starts with a path // component. // // // Hostname, host and protocol should be lowercased so they can be used to // create a proper `origin`. // // // Also parse the supplied query string in to an object. If we're supplied // with a custom parser as function use that instead of the default build-in // parser. // // // If the URL is relative, resolve the pathname against the base URL. // // // We should not add port numbers if they are already the default port number // for a given protocol. As the host also contains the port number we're going // override it with the hostname which contains no port number. // // // Parse down the `auth` for the username and password. // // // The href is just the compiled result. //