docs: function(step, deferred) {
  
        this.currentStep = step;
        delete this.stepSkipped;
        delete this.skipMessage;
  
        // The step description object is passed to all step events; it contains
        // the name of the step that is being executed.
        var description = { name: step.name },
            stepArgs = slice.call(arguments, 2);
  
        // **EVENT:** the `step:start` event is emitted before each step starts executing
        // with the step description object and the step arguments.
        this.emit.apply(this, [ 'step:start', description ].concat(stepArgs));
  
        // The step definition function is called with this scenario as the context
        // and with the step arguments. This is done with the q library so a promise
        // is returned and any errors are handled by the promise chain.
        var stepResult = q.fapply(_.bind(step.definition, this), stepArgs);
  
        // `#handleStepResult`  is called if the promise is resolved, `#handleStepError` otherwise.
        stepResult.then(_.bind(this.handleStepResult, this, deferred, description), _.bind(this.handleStepError, this, deferred, description));
      }