/
evented.js
38 lines (31 loc) · 880 Bytes
/
evented.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import Notifier from './notifier';
// in lieue of a decorator, lets just use Mixin/composition pattern
export function addEvented(Base) {
return class extends Base {
on(eventName, listener) {
return notifierForEvent(this, eventName).addListener(listener);
}
off(eventName, listener) {
return notifierForEvent(this, eventName).removeListener(listener);
}
trigger(eventName, ...args) {
const notifier = notifierForEvent(this, eventName);
if (notifier) {
notifier.trigger.apply(notifier, args);
}
}
}
}
function notifierForEvent(
object,
eventName
) {
if (object._eventedNotifiers === undefined) {
object._eventedNotifiers = {};
}
let notifier = object._eventedNotifiers[eventName];
if (!notifier) {
notifier = object._eventedNotifiers[eventName] = new Notifier();
}
return notifier;
}