/*
name: Class.Binds
description: Alternate Class.Binds Implementation
authors: Scott Kyle (@appden), Christoph Pojer (@cpojer)
license: MIT-style license.
requires: [Core/Class, Core/Function]
provides: Class.Binds
*/
Class.Binds = new Class({
	$bound: {},
	bound: function(name){
		return this.$bound[name] ? this.$bound[name] : this.$bound[name] = this[name].bind(this);
	}
});
/*
---
name: Class.Instantiate
description: Simple Wrapper for Mass-Class-Instantation
authors: Christoph Pojer (@cpojer)
license: MIT-style license.
requires: [Core/Class]
provides: Class.Instantiate
*/
Class.Instantiate = function(klass, options){
	var create = function(object){
		new klass(object, options);
	};
	return function(objects){
		objects.each(create);
	};
};
/*
---
name: Class.Singleton
description: Beautiful Singleton Implementation that is per-context or per-object/element
authors: Christoph Pojer (@cpojer)
license: MIT-style license.
requires: [Core/Class]
provides: Class.Singleton
*/
(function(){
var storage = {
	storage: {},
	store: function(key, value){
		this.storage[key] = value;
	},
	retrieve: function(key){
		return this.storage[key] || null;
	}
};
Class.Singleton = function(){
	this.$className = String.uniqueID();
};
Class.Singleton.prototype.check = function(item){
	if (!item) item = storage;
	var instance = item.retrieve('single:' + this.$className);
	if (!instance) item.store('single:' + this.$className, this);
	return instance;
};
var gIO = function(klass){
	var name = klass.prototype.$className;
	return name ? this.retrieve('single:' + name) : null;
};
if (('Element' in this) && Element.implement) Element.implement({getInstanceOf: gIO});
Class.getInstanceOf = gIO.bind(storage);
}).call(this);

