Source: resource/Resources.js

//------------------------------------------------------------------------------
// Constructor scope
//------------------------------------------------------------------------------

/**
 * Creates a new instance of Resources.
 *
 * @constructor
 *
 * @class
 * @classdesc
 * 
 * The Resources class represents a resource library for data to be used 
 * within a Rune application. Resources can be added and removed during runtime.
 */
rune.resource.Resources = function() {
	
	//--------------------------------------------------------------------------
	// Private properties
	//--------------------------------------------------------------------------
	
	/**
	 * Objects that enable the loading of new resource files.
	 *
	 * @type {rune.resource.Requester}
	 * @private
	 */
	this.m_requester = null;
	
	/**
	 * The resource library's available resources.
	 *
	 * @type {Array.<rune.resource.Resource>}
	 * @private
	 */
	this.m_resources = [];
	
	//--------------------------------------------------------------------------
	// Constructor call
	//--------------------------------------------------------------------------
	
	/**
	 * Invokes secondary class constructor.
	 */
	this.m_construct();
};

//------------------------------------------------------------------------------
// Public prototype getter and setter methods
//------------------------------------------------------------------------------

/**
 * The number of resources currently available in the resource library.
 *
 * @member {number} length
 * @memberof rune.resource.Resources
 * @instance
 * @readonly
 */
Object.defineProperty(rune.resource.Resources.prototype, "length", {
	/**
	 * @this rune.resource.Resources
	 * @ignore
	 */
	get : function() {
		return this.m_resources.length;
	}
});

//------------------------------------------------------------------------------
// Public prototype methods
//------------------------------------------------------------------------------

/**
 * Add a new resource to the resource library.
 *
 * @param {string} name Resource name (ID).
 * @param {Object} data Resource data.
 *
 * @returns {undefined}
 */
rune.resource.Resources.prototype.add = function(name, data) {
	if (this.get(name) == null) {
		this.m_resources.push(
			new rune.resource.Resource(name, data)
		);
	}
};

/**
 * Empty the resource library.
 *
 * @returns {undefined}
 */
rune.resource.Resources.prototype.clear = function() {
	while (this.m_resources.length) {
		this.m_resources[0].dispose();
		this.m_resources[0] = null;
		this.m_resources.splice(0, 1);
	}
};

/**
 * Retrieve a specific resource from the resource library. Each resource is 
 * identified by a unique name (ID). If the desired resource cannot be found, 
 * null is returned instead.
 *
 * @param {string} name Resource name (ID).
 *
 * @returns {rune.resource.Resource}
 */
rune.resource.Resources.prototype.get = function(name) {
	var i = this.m_resources.length;
	while (i--) {
		if (this.m_resources[i]['name'] == name.toLowerCase()) {
			return this.m_resources[i];
		}
	}
	
	return null;
};

/**
 * Deletes a specific resource from the resource library. Deleted resources 
 * are cleared from memory.
 *
 * @param {string} name Resource name (ID).
 *
 * @returns {boolean}
 */
rune.resource.Resources.prototype.remove = function(name) {
	var i = this.m_resources.length;
	while (i--) {
		if (this.m_resources[i]['name'] == name.toLowerCase()) {
			this.m_resources[i].dispose();
			this.m_resources[i] = null;
			this.m_resources.splice(i, 1);
			
			return true;
		}
	}
	
	return false;
};

/**
 * Request a set of files to load into the resource library during runtime.
 *
 * @param {Object} options Request options.
 *
 * @returns {undefined}
 */
rune.resource.Resources.prototype.request = function(options) {
	this.m_requester.load(options);
};

//------------------------------------------------------------------------------
// Public prototype methods (ENGINE)
//------------------------------------------------------------------------------

/**
 * Clears the resource library from memory.
 *
 * @returns {undefined}
 * @ignore
 */
rune.resource.Resources.prototype.dispose = function() {
	this.clear();
	this.m_resources = null;
};

//------------------------------------------------------------------------------
// Protected prototype methods
//------------------------------------------------------------------------------

/**
 * The class constructor.
 *
 * @returns {undefined}
 * @protected
 * @ignore
 */
rune.resource.Resources.prototype.m_construct = function() {
	this.m_constructRequester();
};

//------------------------------------------------------------------------------
// Private prototype methods
//------------------------------------------------------------------------------

/**
 * Creates the Loader object.
 *
 * @returns {undefined}
 * @private
 */
rune.resource.Resources.prototype.m_constructRequester = function() {
	this.m_disposeLoader();
	if (this.m_requester == null) {
		this.m_requester = new rune.resource.Requester(this);
	}
};

/**
 * Removes the Loader object.
 *
 * @returns {undefined}
 * @private
 */
rune.resource.Resources.prototype.m_disposeLoader = function() {
	if (this.m_requester instanceof rune.resource.Requester) {
		this.m_requester.dispose();
		this.m_requester = null;
	}
};