/*! * publisher.js - (c) Ryan Florence 2011 * github.com/rpflorence/publisher.js * MIT License */ // UMD Boilerplate \o/ && D: (function (root, factory) { if (typeof exports === 'object') { module.exports = factory(); // node } else if (typeof define === 'function' && define.amd) { define(factory); // amd } else { // window with noConflict var _publisher = root.publisher; var publisher = root.publisher = factory(); root.publisher.noConflict = function () { root.publisher = _publisher; return publisher; } } }(this, function () { var publisher = function (obj) { var topics = {}; obj = obj || {}; obj.publish = function (topic/*, messages...*/) { if (!topics[topic]) return obj; var messages = [].slice.call(arguments, 1); for (var i = 0, l = topics[topic].length; i < l; i++) { topics[topic][i].handler.apply(topics[topic][i].context, messages); } return obj; }; obj.subscribe = function (topicOrSubscriber, handlerOrTopics) { var firstType = typeof topicOrSubscriber; if (firstType === 'string') { return subscribe.apply(null, arguments); } if (firstType === 'object' && !handlerOrTopics) { return subscribeMultiple.apply(null, arguments); } if (typeof handlerOrTopics === 'string') { return hitch.apply(null, arguments); } return hitchMultiple.apply(null, arguments); }; function subscribe (topic, handler, context) { var reference = { handler: handler, context: context || obj }; topic = topics[topic] || (topics[topic] = []); topic.push(reference); return { attach: function () { topic.push(reference); return this; }, detach: function () { erase(topic, reference); return this; } }; }; function subscribeMultiple (pairs) { var subscriptions = {}; for (var topic in pairs) { if (!pairs.hasOwnProperty(topic)) continue; subscriptions[topic] = subscribe(topic, pairs[topic]); } return subscriptions; }; function hitch (subscriber, topic) { return subscribe(topic, subscriber[topic], subscriber); }; function hitchMultiple (subscriber, topics) { var subscriptions = []; for (var i = 0, l = topics.length; i < l; i++) { subscriptions.push( hitch(subscriber, topics[i]) ); } return subscriptions; }; function erase (arr, victim) { for (var i = 0, l = arr.length; i < l; i++){ if (arr[i] === victim) arr.splice(i, 1); } } return obj; }; // publisher is a publisher, so meta ... return publisher(publisher); }));