1 var events = require('events')
2 var util = require('util')
5 var helper = require('./helper')
7 var bindAllEvents = function (object, context) {
8 context = context || this
10 var bindMethod = function (method) {
11 context.on(helper.camelToSnake(method.substr(2)), function () {
12 var args = Array.prototype.slice.call(arguments, 0)
14 object[method].apply(object, args)
18 for (var method in object) {
19 if (helper.isFunction(object[method]) && method.substr(0, 2) === 'on') {
25 var bufferEvents = function (emitter, eventsToBuffer) {
27 var eventsToReply = []
28 var genericListener = function () {
29 eventsToReply.push(Array.prototype.slice.call(arguments))
32 eventsToBuffer.forEach(function (eventName) {
33 var listener = genericListener.bind(null, eventName)
34 listeners.push(listener)
35 emitter.on(eventName, listener)
43 // remove all buffering listeners
44 listeners.forEach(function (listener, i) {
45 emitter.removeListener(eventsToBuffer[i], listener)
49 eventsToReply.forEach(function (args) {
50 events.EventEmitter.prototype.emit.apply(emitter, args)
54 listeners = eventsToReply = null
58 // TODO(vojta): log.debug all events
59 var EventEmitter = function () {
60 this.bind = bindAllEvents
62 this.emitAsync = function (name) {
63 // TODO(vojta): allow passing args
64 // TODO(vojta): ignore/throw if listener call done() multiple times
65 var pending = this.listeners(name).length
66 var deferred = Q.defer()
67 var done = function () {
79 return deferred.promise
83 util.inherits(EventEmitter, events.EventEmitter)
86 exports.EventEmitter = EventEmitter
87 exports.bindAll = bindAllEvents
88 exports.bufferEvents = bufferEvents