define(function () { function EventObject() { var that = this; var handles = {}; this.on = function (name, callback, once) { var handleQueue = handles[name] || []; handles[name] = handleQueue; handleQueue.push(callback); return this; }; this.off = function (name, callback) { var handleQueue = handles[name] || []; if (callback) { for (var i = handleQueue.length - 1; i >= 0; i--) { if (handleQueue[i] === callback || (handleQueue[i].hasOwnProperty("__rawFn") && handleQueue[i].__rawFn === callback)) { if (handleQueue[i].hasOwnProperty("__rawFn")) delete handleQueue[i].__rawFn; handleQueue.splice(i, 1); } } } else { handleQueue.length = 0; } handles[name] = handleQueue; return this; }; this.fireEvent = function (type) { var ev = typeof (type) === "string" ? new Event(type) : type.type; ev.target = ev.target || this; var handleQueue = handles[type]; if (!handleQueue) return; var args = [].slice.call(arguments, 1); args.unshift(ev); handleQueue = handleQueue.slice(); for (var i in handleQueue) { var handle = handleQueue[i]; if (!handle) continue; if (handle.apply(this, args) === false) { ev.defaultPrevented = true; break; } } return !ev.defaultPrevented; }; this.once = function (name, fn) { var ptr = Function.prototype.apply.bind(fn.bind(this)); var nCallback = function () { delete nCallback.__rawFn; that.off(name, fn); return ptr([].slice.call(arguments)); }; nCallback.__rawFn = fn; that.on(name, nCallback); }; this.addEventListener = this.on; this.removeEventListener = this.off; this.dispatchEvent = this.fireEvent; return this; } return EventObject; });