docs: function() {
        var prepareFieldsContext = {};
        var prepareFields = _.result(this, 'prepareFields');
        if (prepareFields && _.isObject(prepareFields) && !_.isArray(prepareFields)) {
          var keys = _.keys(prepareFields);
          prepareFields = _.map(keys, function(key) {
            return { name: key, value: prepareFields[key] };
          });
        }
        var defaultPrepareFields = [ { name: 'view', value: 'viewState' }, 'model' ];
        prepareFields = _.union(prepareFields, defaultPrepareFields);
        if (prepareFields && prepareFields.length > 0) {
          for (var fieldIndex = 0; fieldIndex < prepareFields.length; fieldIndex++) {
            var prepareField = prepareFields[fieldIndex];
            var prepareFieldIsSimpleString = _.isString(prepareField);
  
            var prepareFieldName = prepareField;
            var prepareFieldValue = prepareField;
  
            if (!prepareFieldIsSimpleString) {
              if (!_.isString(prepareField.name)) {
                throw "prepareFields items need to either be a string or define a .name property that is a simple string to use for the key in the template context.";
              }
  
              if (_.isUndefined(prepareField.value)) {
                throw "prepareFields items need a value property if it is not a string.";
              }
  
              prepareFieldName = prepareField.name;
              prepareFieldValue = prepareField.value;
            }
            if (!_.isUndefined(prepareFieldsContext[prepareFieldName])) {
              throw "duplicate prepareFields name (" + prepareFieldName + ").  Note 'view' and 'model' are reserved names.";
            }
  
            var prepareFieldValueIsDefinedOnView = false;
            if (_.isFunction(prepareFieldValue)) {
              prepareFieldValue = prepareFieldValue.call(this);
            } else {
              // Note _.result() also returns undefined if the 2nd argument is not a string.
              var prepareFieldValueFromView = _.result(this, prepareFieldValue);
              prepareFieldValueIsDefinedOnView = !_.isUndefined(prepareFieldValueFromView);
              if (prepareFieldValueIsDefinedOnView) {
                prepareFieldValue = prepareFieldValueFromView;
              }
            }
  
            if (prepareFieldValue && _.isFunction(prepareFieldValue.toJSON)) {
              prepareFieldsContext[prepareFieldName] = prepareFieldValue.toJSON();
            } else if (!prepareFieldIsSimpleString || prepareFieldValueIsDefinedOnView) {
              prepareFieldsContext[prepareFieldName] = prepareFieldValue;
            }
          }
        }
        var context = this._prepare(prepareFieldsContext);
        if (_.isUndefined(context)) {
          context = prepareFieldsContext;
        } else {
          context = _.extend(prepareFieldsContext, context);
        }
        return context;
      }