function mixInEventEmitter(cls: Function | Object, types: Object) {
  invariant(types, 'Must supply set of valid event types');

  // If this is a constructor, write to the prototype, otherwise write to the
  // singleton object.
  const target = cls.prototype || cls;

  invariant(!target.__eventEmitter, 'An active emitter is already mixed in');

  const ctor = cls.constructor;
  if (ctor) {
    invariant(
      ctor === Object || ctor === Function,
      'Mix EventEmitter into a class, not an instance'
    );
  }

  // Keep track of the provided types, union the types if they already exist,
  // which allows for prototype subclasses to provide more types.
  if (target.hasOwnProperty(TYPES_KEY)) {
    Object.assign(target.__types, types);
  } else if (target.__types) {
    target.__types = Object.assign({}, target.__types, types);
  } else {
    target.__types = types;
  }
  Object.assign(target, EventEmitterMixin);
}
function mixInEventEmitter(cls: Function | Object, types: Object) {
  invariant(types, 'Must supply set of valid event types');

  // If this is a constructor, write to the prototype, otherwise write to the
  // singleton object.
  const target = cls.prototype || cls;

  invariant(!target.__eventEmitter, 'An active emitter is already mixed in');

  const ctor = cls.constructor;
  if (ctor) {
    invariant(
      ctor === Object || ctor === Function,
      'Mix EventEmitter into a class, not an instance'
    );
  }

  // Keep track of the provided types, union the types if they already exist,
  // which allows for prototype subclasses to provide more types.
  if (target.hasOwnProperty(TYPES_KEY)) {
    Object.assign(target.__types, types);
  } else if (target.__types) {
    target.__types = Object.assign({}, target.__types, types);
  } else {
    target.__types = types;
  }
  Object.assign(target, EventEmitterMixin);
}
function mixInEventEmitter ( cls : Function | Object , types : Object ) { invariant ( types , 'Must supply set of valid event types' ) ; // If this is a constructor, write to the prototype, otherwise write to the // singleton object. const target = cls . prototype || cls ; invariant ( ! target . __eventEmitter , 'An active emitter is already mixed in' ) ; const ctor = cls . constructor ; if ( ctor ) { invariant ( ctor === Object || ctor === Function , 'Mix EventEmitter into a class, not an instance' ) ; } // Keep track of the provided types, union the types if they already exist, // which allows for prototype subclasses to provide more types. if ( target . hasOwnProperty ( TYPES_KEY ) ) { Object . assign ( target . __types , types ) ; } else if ( target . __types ) { target . __types = Object . assign ( { } , target . __types , types ) ; } else { target . __types = types ; } Object . assign ( target , EventEmitterMixin ) ; }
API to setup an object or constructor to be able to emit data events.

@example
function Dog() { ...dog stuff... }
mixInEventEmitter(Dog, {bark: true});

var puppy = new Dog();
puppy.addListener('bark', function (volume) {
console.log('Puppy', this, 'barked at volume:', volume);
});
puppy.emit('bark', 'quiet');
// Puppy <puppy> barked at volume: quiet


// A "singleton" object may also be commissioned:

var Singleton = {};
mixInEventEmitter(Singleton, {lonely: true});
Singleton.emit('lonely', true);
API to setup an object or constructor to be able to emit data events .
Mix in an EventEmitter into a class.