$.fn.emitter = {
	log: [],
	/**
	 * Emit an action or data to subcribers.
	 * @memberOf ish.emitter
	 * @param  {String}   type The name of the emission.
	 * @param  {Object} argsObject   An Object of data to be passed with the emission.
	 * @return {$.emitter} Chainable.        
	 */
	emit: function(type, argsObject){
		var listeners = this.listeners[type];
		if(!listeners) return this;
		for (var handler in listeners) {
			listeners[handler].call(this, argsObject);
		}
		if($.fn.emitter.log !== false) $.fn.emitter.log.push({type: type, arguments: argsObject });
		return this;
	},
	/**
	 * Subcribe from an a specific emission.
	 * @memberOf ish.emitter
	 * @param  {String}   type The name of the emission type you are subscribing.
	 * @param  {Function} fn   The function that you are subscribing.
	 * @return {$.emitter} Chainable.        
	 */
	subscribe: function(type, fn){
		this.listeners[type] = this.listeners[type] || [];
		this.listeners[type].push(fn);
		return this;
	},
	/**
	 * Unsubcribe from an a specific emission.
	 * @memberOf ish.emitter
	 * @param  {String}   type The name of the emission type you are unsubscribing.
	 * @param  {Function} fn   The function that you are unsubscribing.
	 * @return {$.emitter} Chainable.        
	 */
	unsubscribe: function(type, fn){
		var listeners = this.listeners[type];
		if(listeners){
			var index = listeners.indexOf(fn);
			listeners.splice(index, 1);
		}		
		return this;
	},
	/**
	 * Remove all subscribers from the emitter instance.
	 * @memberOf ish.emitter
	 * @return {$.emitter} Chainable.        
	 */
	flush : function(){
		this.listeners = null;
		return this;
	}
};
/**
 * A basic emitter factory.
 * @name  ish.emitter
 * @constructor
 * @return {emitter} An instance of the $.emitter
 */
$.emitter = function(){
	var factory = Object.create($.fn.emitter);
	factory.listeners = {};
	return factory;
};