Function.prototype.moo_pass = function( args, bind )
{
	var self = this
	if( args != null )
	{
		args = args || [];
	}
	return function()
	{
		return self.apply( bind, args || arguments );
	}
};

Function.prototype.moo_delay = function( delay, bind, args )
{
	return setTimeout( this.moo_pass( ( args == null ? [] : args ), bind ), delay );
};

Function.prototype.moo_bind = function( bind )
{
	var self = this;
	var args = arguments.length > 1 ? Array.slice( arguments, 1 ) : null;
	return function()
	{
		if( ! args && ! arguments.length )
		{
			return self.call( bind );
		}
		if( args && arguments.length )
		{
			return self.apply( bind, args.concat( typeof arguments == 'array' ? arguments : [] ) );
		}
		return self.apply( bind, args || arguments );
	}
};
