/*	
	Refactored version of:
	
		jQuery pub/sub plugin by Peter Higgins (dante@dojotoolkit.org)
	
		Loosely based on Dojo publish/subscribe API, limited in scope. Rewritten blindly.
	
		Original is (c) Dojo Foundation 2004-2010. Released under either AFL or new BSD, see:
		http://dojofoundation.org/license for more information.
		by Cornel Boudria (thebrain@3-prime.com)
*/	
;(function(){
	// the topic/subscription hash
	var cache = {};
	$publish = function(/* String */topic, /* Array? */args){
		// summary: 
		//		Publish some data on a named topic.
		// topic: String
		//		The channel to publish on
		// args: Array?
		//		The data to publish. Each array item is converted into an ordered
		//		arguments on the subscribed functions. 
		//
		// example:
		//		Publish stuff on '/some/topic'. Anything subscribed will be called
		//		with a function signature like: function(a,b,c){ ... }
		//
		//	|		$publish("/some/topic", ["a","b","c"]);
		cache[topic] && cache[topic].each(function(cb){
			cb.apply(cb, args);
		});
	};
	$subscribe = function(/* String */topic, /* Function */callback){
		// summary:
		//		Register a callback on a named topic.
		// topic: String
		//		The channel to subscribe to
		// callback: Function
		//		The handler event. Anytime something is $.publish'ed on a 
		//		subscribed channel, the callback will be called with the
		//		published array as ordered arguments.
		//
		// returns: Array
		//		A handle which can be used to unsubscribe this particular subscription.
		//	
		// example:
		//	|	$subscribe("/some/topic", function(a, b, c){ /* handle data */ });
		//
		if(!cache[topic]){
			cache[topic] = [];
		}
		cache[topic].push(callback);
		return [topic, callback]; // Array
	};
	$unsubscribe = function(/* Array */handle){
		// summary:
		//		Disconnect a subscribed function for a topic.
		// handle: Array
		//		The return value from a $.subscribe call.
		// example:
		//	|	var handle = $subscribe("/something", function(){});
		//	|	$unsubscribe(handle);
		
		var t = handle[0];
		cache[t] && cache[t].each(function(item, i){
			if(item == handle[1]){
				cache[t].erase(item);
			}
		});
	};
})();
