nl_tokens: helper for creating / storing property definitions and creating appropriate getters / setters
pl_tokens: function createPropertyDefinition ( object , name , desc , isSession ) { var def = object . _definition [ name ] = { } ; var type , descArray ; if ( isString ( desc ) ) { // grab our type if all we've got is a string type = object . _ensureValidType ( desc ) ; if ( type ) def . type = type ; } else { //Transform array of ['type', required, default] to object form if ( Array . isArray ( desc ) ) { descArray = desc ; desc = { type : descArray [ 0 ] , required : descArray [ 1 ] , 'default' : descArray [ 2 ] } ; } type = object . _ensureValidType ( desc . type ) ; if ( type ) def . type = type ; if ( desc . required ) def . required = true ; if ( desc [ 'default' ] && typeof desc [ 'default' ] === 'object' ) { throw new TypeError ( 'The default value for ' + name + ' cannot be an object/array, must be a value or a function which returns a value/object/array' ) ; } def [ 'default' ] = desc [ 'default' ] ; def . allowNull = desc . allowNull ? desc . allowNull : false ; if ( desc . setOnce ) def . setOnce = true ; if ( def . required && def [ 'default' ] === undefined && ! def . setOnce ) def [ 'default' ] = object . _getDefaultForType ( type ) ; def . test = desc . test ; def . values = desc . values ; } if ( isSession ) def . session = true ; if ( ! type ) { type = isString ( desc ) ? desc : desc . type ; // TODO: start throwing a TypeError in future major versions instead of warning console . warn ( 'Invalid data type of `' + type + '` for `' + name + '` property. Use one of the default types or define your own' ) ; } // define a getter/setter on the prototype // but they get/set on the instance Object . defineProperty ( object , name , { set : function ( val ) { this . <mask> ( name , val ) ; } , get : function ( ) { if ( ! this . _values ) { throw Error ( 'You may be trying to `extend` a state object with "' + name + '" which has been defined in `props` on the object being extended' ) ; } var value = this . _values [ name ] ; var typeDef = this . _dataTypes [ def . type ] ; if ( typeof value !== 'undefined' ) { if ( typeDef && typeDef . get ) { value = typeDef . get ( value ) ; } return value ; } var defaultValue = result ( def , 'default' ) ; this . _values [ name ] = defaultValue ; // If we've set a defaultValue, fire a change handler effectively marking // its change from undefined to the default value. if ( typeof defaultValue !== 'undefined' ) { var onChange = this . _getOnChangeForType ( def . type ) ; onChange ( defaultValue , value , name ) ; } return defaultValue ; } } ) ; return def ; }