Eventable = Class.create({

	events : {},
	
	observe : function(eventName, handler)
	{
		// event is not observed at all, so has to be created in events object
		if(! this.events[eventName]) this.events[eventName] = $A();
		
		// event allready observed by this handler
		if(this.events[eventName].indexOf(handler) != -1) return
		
		// push event handler
		this.events[eventName].push(handler);
	},
	
	stopObserving : function(eventName, handler)
	{
		if(! this.events[eventName] ) return;
		
		index = this.events[eventName].indexOf(handler) ;
		if(index == -1) return;
		
		delete this.events[eventName][index];
	},
	
	fire : function(eventName, memo)
	{
		if(!this.events[eventName]) return;
		
		event = new Eventable.Event(this, memo || {});
		
		for(i = 0; i < this.events[eventName].length; ++i)
		{
			this.events[eventName][i](event);
			if(event.stopped) break;
		}
	}	
});

Eventable.Event = Class.create({

	object : null,
	stopped : false,

	initialize : function(object, memo)
	{
		this.object = object;
		this.memo = memo;
	},
	
	stop : function()
	{
		this.stopped = true;
	}
});
	
