app.pubsub = (function(){ app.topics = {}; app.subscribe = function(topic, listener) { if(topic instanceof RegExp){ listener.match = topic; topic = "__REGEX__"; } // create the topic if not yet created if(!app.topics[topic]) app.topics[topic] = []; // add the listener app.topics[topic].push(listener); } app.matchTopics = function(topic){ topic = topic || ''; var matches = [... app.topics[topic] ? app.topics[topic] : []]; if(!app.topics['__REGEX__']) return matches; for(var listener of app.topics['__REGEX__']){ if(topic.match(listener.match)) matches.push(listener); } return matches; } app.publish = function(topic, data) { // send the event to all listeners app.matchTopics(topic).forEach(function(listener) { setTimeout(function(data, topic){ listener(data || {}, topic); }, 0, data, topic); }); } return this; })(app);