-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy patheventbus.js
126 lines (97 loc) · 2.68 KB
/
eventbus.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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
'use strict';
var absent = require('absent');
var types = require('the.types');
var TheEvent = function (_name) {
var _defaultMethodName = _name;
var nameIncludes_On_Prefix = function () {
return _name.indexOf("on") === 0;
}
if (absent.not(nameIncludes_On_Prefix())) {
_defaultMethodName = "on" + _name;
}
var listeners = types.array();
this.name = function () {
return _name;
}
this.method = function()
{
return _defaultMethodName;
}
this.setDefaultMethod = function(methodName)
{
_defaultMethodName = methodName;
}
this.fire = function (source) {
var firingStopped = false;
listeners.iterate(function (index, listener) {
var keepContinue = true;
if (absent.isNull(listener.providesCondition)
|| listener.providesCondition(source)) {
keepContinue = listener.trigger(source);
firingStopped = firingStopped && (absent.isSet(keepContinue) && keepContiue == false);
}
return keepContinue;
});
return absent.not(firingStopped);
}
this.addListener = function (listener) {
listeners.add(listener);
return this;
}
}
var TheEvents = types.map();
var TheListener = function (object) {
var self = this;
var methodName = null;
var desc = null;
var conditionToTriggerListener = null;
this.desc = function(descText)
{
desc = descText;
return self;
}
this.getDesc = function(){
return desc;
}
this.withMethod = function(_methodName)
{
methodName = _methodName;
return self;
}
this.listen = function (eventNameParameter) {
var event = TheEvents.get(eventNameParameter);
if(absent.isNull(methodName))
{
methodName = event.method();
}
event.addListener(self);
return self;
}
this.when = function (condition) {
conditionToTriggerListener = condition;
return self;
}
this.providesCondition = function (source) {
if (absent.isNull(conditionToTriggerListener)) {
return true;
}
return conditionToTriggerListener(source);
}
this.trigger = function (source) {
return object[methodName](source);
}
}
module.exports = {
event : function (name) {
var event = TheEvents.get(name);
if (absent.isNull(event)) {
event = new TheEvent(name);
TheEvents.put(name, event);
}
return event;
},
listener : function(listenerObject)
{
return new TheListener(listenerObject);
}
};