docs: function bind() {
    var that = this;
    that.on('start', function(ctx) {
      that.count = -1;
      that.emit('next', ctx);
    }).on('next', function(ctx) {
      try {
        that.count++;
        if (that.stack[that.count]) {
          that.stack[that.count].handle.call(ctx);
        } else {
          that.emit('end', ctx);
        }
      } catch(e) {
        ctx.res.end(e.toString());
      }
    }).on('end', function(ctx) {
      that.emit('beforeEnd', ctx);
      ctx.res.statusCode = ctx.statusCode || 500;
  
      ctx.headers.forEach(function(header) {
        Object.keys(header).forEach(function(k) {
          ctx.res.setHeader(k, header[k]);
        });
      });
      var powerByString = that.options.pkg.name + '/' + that.options.pkg.version;
      powerByString += ' node' + '/' + process.version;
      powerByString += ' (' + os.platform() + ')';
      ctx.res.setHeader('Server', powerByString);
      ctx.res.write(ctx.body || '', 'utf8');
      ctx.res.end();
    });
  }