/*jshint laxcomma:true, smarttabs: true , node: true */ 'use strict'; /** * Allows for options data configuration for class instances * @module tastypie/lib/class/options * @author Eric Satterwhite * @requires tastypie/lib/class * @requires mout/object/merge * @requires mout/array/append **/ var Class = require('./index') , merge = require( 'mout/object/deepMixIn' ) , append = require( 'mout/array/append' ) ; function removeOn( name ){ return name.replace(/^on([A-Z])/, function(full, first ){ return first.toLowerCase(); }); } /** * Mixin class providing configuration options * @constructor * @alias module:tastypie/lib/class/options * @param {Object} [options={}] object to use as overrides * @example var conf = new options(); conf.setOptions({ key:{ a:1, b:2 } }); conf.setOptions({key:{b:3}}) conf.options.key.b // 3 conf.options.key.a // 1 */ module.exports = new Class({ /** * Over rides internal values with supplied object * @method module:tastypie/lib/class/options#setOptions * @param {Object} options The options object to use as configuration overrides **/ setOptions: function setOptions( options ){ if( this.addListener ){ for( var opt in options ){ if( typeof( options[ opt ] ) !== 'function' || !(/^on[A-z]/).test(opt)){ continue; } this.addListener( removeOn( opt ), options[ opt ]); delete options[opt]; } } this.options = merge.apply(null, append([{}, this.options], arguments ) ); return this; } });