Function.prototype.closure = function(obj) {
	// Extends the Function object, adding a closure() method which
	// fixes circular references and MSIE's lack of garbage collection
	// as a result thereof.
	//
	// From: http://laurens.vd.oever.nl/weblog/items2005/closures/
	//
	// Init object storage.
	if (!window.__objs)
	{
		window.__objs = [];
		window.__funs = [];
	}

	// For symmetry and clarity.
	var fun = this;

	// Make sure the object has an id and is stored in the object store.
	var objId = obj.__objId;
	if (!objId)
		__objs[objId = obj.__objId = __objs.length] = obj;

	// Make sure the function has an id and is stored in the function store.
	var funId = fun.__funId;
	if (!funId)
		__funs[funId = fun.__funId = __funs.length] = fun;

	// Init closure storage.
	if (!obj.__closures)
		obj.__closures = [];

	// See if we previously created a closure for this object/function pair.
	var closure = obj.__closures[funId];
	if (closure)
		return closure;

	// Clear references to keep them out of the closure scope.
	obj = null;
	fun = null;

	// Create the closure, store in cache and return result.
	return __objs[objId].__closures[funId] = function ()
	{
		return __funs[funId].apply(__objs[objId], arguments);
	};
};

