docs: function setupModel(instance) {
        var changeHandler = {
          /**
           * Proxy set() handler. This is where the change events are fired from
           *
           * @method GQLBase~set
           * @param {Object} target the `GQLBase` model object
           * @param {string} key the property name
           * @param {mixed} value the new property value
           */
          set: function set(target, key, value) {
            var old = target[key];
            target[key] = value;
            instance.emit(GQLBase.EVENT_MODEL_PROP_CHANGE, {
              model: target,
              old: old,
              key: key,
              value: value
            });
          },
  
          /**
           * Proxy deleteProperty() handler. This is where the delete property
           * events are fired from
           *
           * @method GQLBase~deleteProperty
           * @param {Object} target the `GQLBase` model object
           * @param {string} key the property name
           */
          deleteProperty: function deleteProperty(target, key) {
            var deleted = target[key];
            delete target[key];
            instance.emit(GQLBase.EVENT_MODEL_PROP_DELETE, {
              model: target,
              key: key,
              deleted: deleted
            });
          }
        };
        /**
         * 'Publicly' the Symbol for accessing the `GQLBase` model is `MODEL_KEY`.
         * In truth it is stored under a Symbol defined in `setupModel` and
         * referred to as `_MODEL_KEY` in this code. This is done so a getter and
         * setter can be wrapped around the usage of the instance's data model.
         *
         * When being read, if `Proxy` exists in the node environment and if there
         * are any registered `EVENT_MODEL_PROP_CHANGE` or `EVENT_MODEL_PROP_DELETE`
         * events, then the returned model is a Proxy around the real model that
         * allows us to capture the changes and deletion of keys
         *
         * When being assigned, the event `EVENT_MODEL_WILL_BE_SET` and the event
         * `EVENT_MODEL_HAS_BEEN_SET` are emitted to allow listeners to modify and
         * see the final data around the setting of a model object. Both events
         * receive an object with two keys
         *
         * ```
         * {
         *   model: The object being or having been set
         *   instance: The GQLBase instance receiving the model
         * }
         * ```
         */
  
        Object.defineProperty(instance, MODEL_KEY, {
          get: function get() {
            var model = this[_MODEL_KEY];
            var hasListeners = this.listenerCount(GQLBase.EVENT_MODEL_PROP_CHANGE) + this.listenerCount(GQLBase.EVENT_MODEL_PROP_DELETE);
  
            if (hasProxy && hasListeners) {
              model = new Proxy(model, changeHandler);
            }
  
            return model;
          },
          set: function set(model) {
            var instance = this;
            this.emit(GQLBase.EVENT_MODEL_WILL_BE_SET, {
              model: model,
              instance: instance
            });
            instance[_MODEL_KEY] = model;
            this.emit(GQLBase.EVENT_MODEL_HAS_BEEN_SET, {
              model: model,
              instance: instance
            });
          }
        });
      }