sp = {
	clone: 	function(superclass, mixins){
		var original = superclass.__original__ || superclass;
		var f = function(){ original.apply(this, arguments); }
		f.__original__ = superclass;

		var unchain = arguments[arguments.length-1] === true;
		f.prototype = (unchain) ? sp.mixin({}, superclass.prototype) : sp.delegate(superclass.prototype);

		for(var i=1, arg, l=arguments.length-unchain, args=[f.prototype]; i<l; i++){
			arg = arguments[i];
			args[i] = (typeof arg == "function") ? arg.prototype : arg;
		}
		sp.mixin.apply(null, args);

		f.prototype.constructor = f;

		return f;
	},
	delegate: function(obj){
		function TMP(){};
		TMP.prototype = obj;
		return new TMP();
	},
	mixin: function(obj){
		for(var i=1, l=arguments.length; i<l; i++){
			sp._mixin(obj, arguments[i]);
		}
		return obj;
	},
	_mixin: function(obj, props){
		for(var x in props){
			obj[x] = props[x];
		}
		return obj;
	}
}