docs: function(options) {
        options = options || {};
  
        var startTime = new Date().getTime(),
            requestNumber = ++this.requestNumber,
            requestHandler = options.handler;
  
        // The returned promise is part of chain that starts with the asynchronous construction of the request options.
        var promise = q.fcall(_.bind(this.buildRequestOptions, this), options).then(_.bind(this.checkRequestOptions, this));
  
        // Then the HTTP request is started.
        promise = promise.then(_.bind(this.sendRequest, this, requestNumber, requestHandler, startTime));
  
        // Finally, handlers are added at the end of the promise chain to emit `error` or `response` events depending on the result.
        return promise.spread(_.bind(this.handleResponse, this, requestNumber, startTime), _.bind(this.handleError, this, requestNumber));
      }