docs: function (args, callback) {
              var that = this;
  
              // Retrieve arguments
              var name = args.name;
              var Controller = args.Class;
              var options = args.options || {};
              var extra_options = args.extra;
  
              // UID of the page.
              var pageUID = name + JSON.stringify(options).replace(/["{}]/g, "");
              this._openInProgress = pageUID;
  
              // Run Controller Garbage Collector
              this.runGC += 1;
              if (this.runGC > 5) {
                  this.runGC = 0;
                  this._clearControllers();
              }
  
              // Add extra_options to options
              if (extra_options) {
                  options = _.extend(options, extra_options);
              }
  
              // Adjust the backhash option
              if (options && options.backhash) {
                  options.back = {
                      title: options.backtitle || 'Back',
                      hash:  options.backhash
                  };
              }
  
              // Called when the views and controller are done being created
              var ctrl = null;
              var doneCreate = function () {
  
                  // It happens that a refresh takes so long that the
                  // view is GCed between refresh and doneCreate. Most probably
                  // the user tried to open another view in the meantime,
                  // So let's ignore the create view event.
                  if (!that.controllers[pageUID] || (pageUID !== that._openInProgress)) {
                      return;
                  }
  
                  // Return root view (a JQMView)
                  that.setCurrentController(ctrl);
                  that.controllers[pageUID].lastView = +new Date();
  
                  // Update options
                  ctrl._rootView.setOptions(ctrl.options);
  
                  // Events.trigger('change:pagecid', ctrl.componentCID, ctrl.reportCID);
                  ctrl._rootView._pageUID = pageUID;
  
                  if (typeof callback === 'function') {
                      callback(ctrl._rootView);
                  }
              };
  
              // Create Controller if not exists.
              if (typeof this.controllers[pageUID] !== 'undefined') {
                  ctrl = this.controllers[pageUID].controller;
                  if (typeof ctrl.refresh === 'function') {
                      ctrl.refresh(doneCreate);
                  }
                  else {
                      doneCreate();
                  }
              } else {
                  // Should we create a Header and/or Footer?
                  var noHeader = (options && options.noHeader) ||
                      (!Jackbone.DefaultHeader);
                  var noFooter = (options && options.noFooter) ||
                      (!Jackbone.DefaultFooter);
  
                  // Initialize the controller
                  ctrl = new Controller(options);
  
                  // Create views for a controller
                  var createViews = function () {
                      var content = ctrl.view;
                      var header  = noHeader ? null : new Jackbone.DefaultHeader();
                      var footer  = noFooter ? null : new Jackbone.DefaultFooter();
                      var view    = new JQMView(header, content, footer);
  
                      // Cache the controller
                      that.controllers[pageUID] = { pageUID: pageUID, controller: ctrl };
                      ctrl._rootView = view;
                      view.controller = ctrl;
  
                      doneCreate();
                  };
  
                  // Give the chance to the controller to refresh its models
                  // before we create the views.
                  if (typeof ctrl.firstRefresh === 'function') {
                      ctrl.firstRefresh(createViews);
                  }
                  else {
                      createViews();
                  }
              }
  
          }