// Provide a namespace for subclasses
var ns = {};

// The base 'event aware' class
var Toolkit = Class.create(
{
	identifier:        null, // Instance ident
	listener_register: null, // Listener register
	
	initialize: function ()
	{
		this.identifier = this.generateIdentifier();
		this.listener_register = new Hash();
		return this;
	},
	
	generateIdentifier: (function ()
	{
    var i = 1;
    return function () {
      return String(i++);
    };
	})(),
	
	getClassNameFromSelector:function (selector)
	{
		return selector.replace (/^.*?([a-z]+$)/i, '$1');
	},
	
	observe: function (event_name, callback)
	{
		document.observe(event_name + this.identifier, callback);
    return this;
	},
	
	stopObserving: function (event_name, callback)
	{
		if(typeof callback == 'string') document.stopObserving(event_name + this.identifier, this.getListener(callback)); 
		else document.stopObserving(event_name + this.identifier, callback);
    return this;
	},
	
	fire: function (event_name, memo)
	{
    // if (console) console.log(event_name + this.identifier);
		document.fire(event_name + this.identifier, memo); 
    return this;
	},
	
	setListener: function (listener, handle)
	{
		this.listener_register.set(handle, listener);
		return this.getListener(handle);
	},
	
	getListener: function (handle)
	{
		return this.listener_register.get(handle)
	},
	
	getClassNameFromSelector: function (selector)
	{
		return selector.replace(/^.?([a-z\-_]+$)/i, '$1');
	}
});
