text: /**
   * Module dependencies.
   */
  var Application = require('./application')
    , Request = require('./request')
    , Response = require('./response');
  
  
  /**
   * Creates an instance of `Test`.
   *
   * @constructor
   * @api protected
   */
  function Test(setup, controller, action, isDynamic) {
    this._setup = setup;
    this._controller = controller;
    this._action = action;
    this._isDynamic = isDynamic;
  }
  
  /**
   * Register a callback to be invoked when application is prepared.
   *
   * @param {Function} cb
   * @return {Test} for chaining
   * @api public
   */
  Test.prototype.app = function(cb) {
    this._app = cb;
    return this;
  };
  
  /**
   * Register a callback to be invoked when request is prepared.
   *
   * @param {Function} cb
   * @return {Test} for chaining
   * @api public
   */
  Test.prototype.req = function(cb) {
    this._req = cb;
    return this;
  };
  
  /**
   * Register a callback to be invoked when response is prepared.
   *
   * @param {Function} cb
   * @return {Test} for chaining
   * @api public
   */
  Test.prototype.res = function(cb) {
    this._res = cb;
    return this;
  };
  
  /**
   * Create initalized helper.
   *
   * @api public
   */
  Test.prototype.create = function(cb) {
    var self = this
      , app = new Application()
      , req = new Request()
      , before = this._req;
  
    function ready() {
      var res = new Response()
        , helper, name;
  
      if (self._res) { self._res(res); }
  
      req._emvc = {};
      req._emvc.app = app;
      req._emvc.controller = self._controller;
      req._emvc.action = self._action;
  
      var ctx = new Object()
        , helpers = app._helpers
        , dynamicHelpers = app._dynamicHelpers
        , key;
      for (key in helpers) {
        ctx[key] = helpers[key];
      }
      for (key in dynamicHelpers) {
        ctx[key] = dynamicHelpers[key].call(undefined, req, res);
      }
  
      if (self._isDynamic) {
        name = self._setup.name;
        helper = self._setup(req, res).bind(ctx);
        ctx[name] = helper;
      } else {
        name = self._setup.name;
        helper = self._setup.bind(ctx);
        ctx[name] = helper;
      }
  
      return cb(null, helper);
    }
  
    if (self._app) { self._app(app); }
  
    if (before && before.length == 2) {
      before(req, ready);
    } else if (before) {
      before(req);
      ready();
    } else {
      ready();
    }
  };
  
  
  /**
   * Expose `Test`.
   */
  module.exports = Test;
  