docs: function Teepee(config) {
      if (!(this instanceof Teepee)) {
          // Invoked without new, shorthand for issuing a request
          var args = Array.prototype.slice.call(arguments);
          var teepee;
          if (typeof args[0] === 'string' || (args[0] && typeof args[0] === 'object')) {
              teepee = new Teepee(args.shift());
          }
          return teepee.request.apply(teepee, args);
      }
  
      EventEmitter.call(this);
  
      if (typeof config === 'string') {
          config = { url: config };
      }
  
      this._userSuppliedConfigOptionNames = [];
      if (config) {
          Object.keys(config).forEach(function (key) {
              var value = config[key];
              if (typeof value !== 'undefined') {
                  if (key === 'agent' && typeof value !== 'boolean') {
                      var protocol = config.url && /^https:/.test(config.url) ? 'https' : 'http';
                      this.agentByProtocol = this.agentByProtocol || {};
                      this.agentByProtocol[protocol] = value;
                  } else if (key === 'cert' || key === 'key' || key === 'ca') {
                      this[key] = resolveCertKeyOrCa(value);
                      this._userSuppliedConfigOptionNames.push(key);
                  } else if (typeof this[key] === 'undefined') {
                      this[key] = value;
                      this._userSuppliedConfigOptionNames.push(key);
                  } else {
                      // Ignore unsupported property that would overwrite or shadow for a built-in property or method
                  }
              }
          }, this);
      }
  
      if (typeof this.url === 'string') {
          if (/^[A-Z]+ /.test(this.url)) {
              var urlFragments = this.url.split(' ');
              if (urlFragments.length > 1) {
                  this.method = urlFragments.shift();
                  this.url = urlFragments.join(' ');
              }
          }
      }
  }