BLIP.Class.create("BLIP.Object", Object,
	// Constructor	
	function() {},

	// Class
	{
		listeners: {},
		
		getCallback:function(f) {
			var self = this;
			return function() {
				f.apply(self,arguments);
			}
		},
		
		addEventListener:function(eventName, func) {
			if (this.listeners[eventName]) {
				this.listeners[eventName].push(func);
			}
			else {
				this.listeners[eventName] = [func];
			}
		},
		
		fireEvent:function(eventName, args) {
			var handlers = this.listeners[eventName];
			
			if (handlers) {
				for (var i=0; i<handlers.length; i++) {
					handlers[i](args);
				}
			}
		},
		
		log:function() {
			try {
				console.log.apply( console, arguments );
			} 
			catch(e) {
				try {
					opera.postError.apply( opera, arguments );
				} catch(e){}
			}
		},
		
		superCall:function(functionName, args) {
			return this.superClass.prototype[functionName].call(this,args);
		},
		
		superConstruct:function(args) {
			this.superClass.call(this,args);
		},
		
		asArray: function(args) {
			var result = [];
			for (var i=0; i<args.length; i++) {
				result[i] = args[i];
			}
			return result;
		},
		
		delegate: function(func) {
			var self = this;
			var dargs = this.asArray(arguments);
			dargs.splice(0,1);
			
			var f = function() { func.apply(self,Array.concat(self.asArray(arguments),dargs)); }
			return f;	
		}
	}
);


