function /* class */ EventController(eventResponderObject) {

  copy_properties(this, {
        queue : [],
        ready : false,
    responder : eventResponderObject
  });

};

copy_properties(EventController.prototype, {

  startQueue : function( ) {
    this.ready = true;
    this.dispatchEvents( );
    return this;
  },

  pauseQueue : function( ) {
    this.ready = false;
    return this;
  },

  addEvent : function(event) {

    if (event.toLowerCase() !== event) {
      Util.warn(
        'Event name %q contains uppercase letters; events should be lowercase.',
        event);
    }

    var args = [];
    for (var ii = 1; ii < arguments.length; ii++) {
      args.push(arguments[ii]);
    }

    this.queue.push({ type: event, args: args });
    if (this.ready) {
      this.dispatchEvents( );
    }

    return false;
  },

  dispatchEvents : function( ) {

    if (!this.responder) {
      Util.error(
        'Event controller attempting to dispatch events with no responder! '   +
        'Provide a responder when constructing the controller.');
    }

    for (var ii = 0; ii < this.queue.length; ii++) {
      var evtName = 'on' + this.queue[ii].type;
      if (typeof(this.responder[evtName]) != 'function' &&
          typeof(this.responder[evtName]) != 'null') {
        Util.warn(
          'Event responder is unable to respond to %q event! Implement a %q '  +
          'method. Note that method names are case sensitive; use lower case ' +
          'when defining events and event handlers.',
          this.queue[ii].type,
          evtName);
      } else {
        if (this.responder[evtName]) {
          this.responder[evtName].apply(this.responder, this.queue[ii].args);
        }
      }
    }
    this.queue = [];
  }

});

