docs: function (options, callback) {
              options = options || {};
  
              if (options.limit || options.offset) {
                  this.$offset = options.offset || 0;
                  this.$limit = options.limit || this.$limit;
              }
  
              var self = this;
  
              function pageFetchedComplete(err, page, originalCallback) {
                  var callback = function (err, page) {
                      if (originalCallback) {
                          originalCallback(err, page, options);
                      }
                  };
  
  
                  if (options.fetchModels || options.fetchSubModels) {
  
                      // TODO: introduce poolSize parameter for par, and parEach
  
                      flow()
                          .parEach(page.$items, function (model, cb) {
                              model.fetch({
                                  fetchSubModels: options.fetchSubModels
                              }, cb);
                          })
                          .exec(function (err) {
                              callback(err, page);
                          });
  
                  } else {
                      callback(err, page);
                  }
  
              }
  
              if (this._fetch.state === State.LOADING) {
                  // currently fetching -> register callback
                  this._fetch.callbacks.push(function (err, page) {
                      pageFetchedComplete(err, page, callback);
                  });
              } else if (this._fetch.state == State.LOADED) {
                  // completed loaded -> execute
                  pageFetchedComplete(null, this, callback);
              } else {
                  // set state and start loading
                  self._fetch.state = State.LOADING;
  
                  this.$collection.$context.$dataSource.loadCollectionPage(this, options, function (err, page) {
                      self._fetch.state = err ? State.ERROR : State.LOADED;
  
                      // execute callbacks
                      pageFetchedComplete(err, page, callback);
  
                      _.each(self._fetch.callbacks, function (cb) {
                          cb(err, page);
                      });
                  });
              }
          }