docs: function asyncRender(view, data, raw) {
    
    var request = this.request;
    
    // Get raw option, or set default
    raw = (raw || app.config.rawViews);
    
    // Get controller, or set default
    var controller = (this.__controller || app.controller);
  
    // Get engine
    var viewPath = this.getViewPath(view);
    var engine = app.defaultEngine.getEngineByExtension(viewPath);
    
    if (!engine) {
      // Using this.end to prevent infinite loops
      this.statusCode = 500;
      this.end('500 Internal Server Error');
      if (viewPath) {
        app.log(new Error("View not found or no engine detected for route: " + request.url));
      } else {
        app.log("View not found: %s/%s", controller.getAlias(), view);
      }
      return;
    } else if (engine.multiPart === false) {
      // Force raw on non-multiPart engines
      raw = true;
    }
    
    // Attach engine to response
    this.engine = engine;
  
    // Detect args
    if (typeof data == 'boolean') { raw = data; data = null; }
    
    // Create new object with partials as prototype
    var proto = Object.create(engine.returnPartials());
    
    // Make app.locals available as view locals
    _.extend(proto, app.locals);
    
    if (data == null) {
      // If no data available, use proto as data
      data = proto;
    } else {
      // Set proto as data`s prototype
      data.__proto__ = proto;
    }
    
    // View Locals
    data = _.extend(data, {
      protos: protos,
      app: app,
      res: this,
      req: request,
      params: request.params,
      session: request.session || {},
      cookies: request.cookies || {},
    });
    
    // Extend data with request metadata
    _.extend(data, request.__metadata);
    
    // Add `locals` variable redundancy
    data.locals = this.viewLocals = data;
    
    // Add view data filter. Useful if you want to add locals
    app.emit('view_locals', data);
    
    // Render full layout or response
    // TODO: Ability to pass an array with the desired layout to res.render (awesome!)
    // TODO: If view is an array, ignore the `raw` option
    var views = (raw) ? [view] : ['@header', view, '@footer'];
      
    // TODO: Assign status code based on template name (validated with regex)
    if (view == '#404') this.statusCode = 404;
    else if (view == '#500') this.statusCode = 500;
  
    this.__runtimeData = {
      buffer: '',
      data: data,
      views: views,
      currentView: null,
      controller: controller,
      mainView: view,
    };
    
    renderViewBuffer.call(this);
  }