code: function defineOnChangeProperty(obj, propName, event) {
      if (!propName) propName = 'data';
      if (!event) event = 'data';
      let _prop = '_' + propName;
      Object.defineProperty(obj, _prop, {
          value: {},
          writable: true
      });
      Object.defineProperty(obj, propName, {
          enumerable: true,
          get: function() { return obj[_prop] },
          set: function(data) {
              let oldData = obj[_prop];
              obj[_prop] = data || {};
              if ((obj instanceof EventEmitter)
                  && ! deepEqual(obj[_prop], oldData)) {
                  obj.emit('_' + event, obj); // for obj-internal use
                  obj.emit(event, obj);
              }
          }
      });
  }
docs: Defines a property with the given name for the given object using a
  getter/setter combination. If the objset is an event emitter, the
  object will emit an event of the given name if a property set changes
  the value of the property.
  
  @param {object} obj - the object for which to define the property
  @param {string} [propName] - the name of the property, defaults to 'data'
  @param {event} [event] - the name of the event to emit, defaults to 'data'
  @memberof module:lib/util
  @since 0.7.0