;(function() { 'use strict'; /** * This utils aims to facilitate the manipulation of each instance setting. * Using a function instead of an object brings two main advantages: First, * it will be easier in the future to catch settings updates through a * function than an object. Second, giving it a full object will "merge" it * to the settings object properly, keeping us to have to always add a loop. * * @return {configurable} The "settings" function. */ var configurable = function() { var i, l, data = {}, datas = Array.prototype.slice.call(arguments, 0); /** * The method to use to set or get any property of this instance. * * @param {string|object} a1 If it is a string and if a2 is undefined, * then it will return the corresponding * property. If it is a string and if a2 is * set, then it will set a2 as the property * corresponding to a1, and return this. If * it is an object, then each pair string + * object(or any other type) will be set as a * property. * @param {*?} a2 The new property corresponding to a1 if a1 * is a string. * @return {*|configurable} Returns itself or the corresponding * property. * * Polymorphism: * ************* * Here are some basic use examples: * * > settings = new configurable(); * > settings('mySetting', 42); * > settings('mySetting'); // Logs: 42 * > settings('mySetting', 123); * > settings('mySetting'); // Logs: 123 * > settings({mySetting: 456}); * > settings('mySetting'); // Logs: 456 * * Also, it is possible to use the function as a fallback: * > settings({mySetting: 'abc'}, 'mySetting'); // Logs: 'abc' * > settings({hisSetting: 'abc'}, 'mySetting'); // Logs: 456 */ var settings = function(a1, a2) { var o, i, l, k; if (arguments.length === 1 && typeof a1 === 'string') { if (data[a1] !== undefined) return data[a1]; for (i = 0, l = datas.length; i < l; i++) if (datas[i][a1] !== undefined) return datas[i][a1]; return undefined; } else if (typeof a1 === 'object' && typeof a2 === 'string') { return (a1 || {})[a2] !== undefined ? a1[a2] : settings(a2); } else { o = (typeof a1 === 'object' && a2 === undefined) ? a1 : {}; if (typeof a1 === 'string') o[a1] = a2; for (i = 0, k = Object.keys(o), l = k.length; i < l; i++) data[k[i]] = o[k[i]]; return this; } }; /** * This method returns a new configurable function, with new objects * * @param {object*} Any number of objects to search in. * @return {function} Returns the function. Check its documentation to know * more about how it works. */ settings.embedObjects = function() { var args = datas.concat( data ).concat( Array.prototype.splice.call(arguments, 0) ); return configurable.apply({}, args); }; // Initialize for (i = 0, l = arguments.length; i < l; i++) settings(arguments[i]); return settings; }; /** * EXPORT: * ******* */ if (typeof this.sigma !== 'undefined') { this.sigma.classes = this.sigma.classes || {}; this.sigma.classes.configurable = configurable; } else if (typeof exports !== 'undefined') { if (typeof module !== 'undefined' && module.exports) exports = module.exports = configurable; exports.configurable = configurable; } else this.configurable = configurable; }).call(this);