@@ -2501,6 +2501,10 @@ BaseConfig.prototype.beforeUpdate = lifecycleNoop;
25012501BaseConfig . prototype . afterUpdate = lifecycleNoop ;
25022502BaseConfig . prototype . beforeDestroy = lifecycleNoop ;
25032503BaseConfig . prototype . afterDestroy = lifecycleNoop ;
2504+ BaseConfig . prototype . beforeInject = function ( ) {
2505+ } ;
2506+ BaseConfig . prototype . afterInject = function ( ) {
2507+ } ;
25042508
25052509/**
25062510 * @doc function
@@ -2531,6 +2535,8 @@ function DSProvider() {
25312535 * - `{function}` - `afterUpdate` - See [](). Default: No-op
25322536 * - `{function}` - `beforeDestroy` - See [](). Default: No-op
25332537 * - `{function}` - `afterDestroy` - See [](). Default: No-op
2538+ * - `{function}` - `beforeInject` - See [](). Default: No-op
2539+ * - `{function}` - `afterInject` - See [](). Default: No-op
25342540 */
25352541 var defaults = this . defaults = new BaseConfig ( ) ;
25362542
@@ -2840,6 +2846,7 @@ function changes(resourceName, id) {
28402846module . exports = changes ;
28412847
28422848} , { } ] , 44 :[ function ( require , module , exports ) {
2849+ /*jshint evil:true*/
28432850var errorPrefix = 'DS.defineResource(definition): ' ;
28442851
28452852function Resource ( utils , options ) {
@@ -2892,6 +2899,10 @@ function Resource(utils, options) {
28922899 * - `{string="id"}` - `idAttribute` - The attribute that specifies the primary key for this resource.
28932900 * - `{string=}` - `endpoint` - The attribute that specifies the primary key for this resource. Default is the value of `name`.
28942901 * - `{string=}` - `baseUrl` - The url relative to which all AJAX requests will be made.
2902+ * - `{object=}` - `methods` - If provided, items of this resource will be wrapped in a constructor function that is
2903+ * empty save for the attributes in this option which will be mixed in to the constructor function prototype. Enabling
2904+ * this feature for this resource will incur a slight performance penalty, but allows you to give custom behavior to what
2905+ * are now "instances" of this resource.
28952906 * - `{function=}` - `beforeValidate` - Lifecycle hook. Overrides global. Signature: `beforeValidate(resourceName, attrs, cb)`. Callback signature: `cb(err, attrs)`.
28962907 * - `{function=}` - `validate` - Lifecycle hook. Overrides global. Signature: `validate(resourceName, attrs, cb)`. Callback signature: `cb(err, attrs)`.
28972908 * - `{function=}` - `afterValidate` - Lifecycle hook. Overrides global. Signature: `afterValidate(resourceName, attrs, cb)`. Callback signature: `cb(err, attrs)`.
@@ -2901,6 +2912,8 @@ function Resource(utils, options) {
29012912 * - `{function=}` - `afterUpdate` - Lifecycle hook. Overrides global. Signature: `afterUpdate(resourceName, attrs, cb)`. Callback signature: `cb(err, attrs)`.
29022913 * - `{function=}` - `beforeDestroy` - Lifecycle hook. Overrides global. Signature: `beforeDestroy(resourceName, attrs, cb)`. Callback signature: `cb(err, attrs)`.
29032914 * - `{function=}` - `afterDestroy` - Lifecycle hook. Overrides global. Signature: `afterDestroy(resourceName, attrs, cb)`. Callback signature: `cb(err, attrs)`.
2915+ * - `{function=}` - `beforeInject` - Lifecycle hook. Overrides global. Signature: `beforeInject(resourceName, attrs)`.
2916+ * - `{function=}` - `afterInject` - Lifecycle hook. Overrides global. Signature: `afterInject(resourceName, attrs)`.
29042917 */
29052918function defineResource ( definition ) {
29062919 if ( this . utils . isString ( definition ) ) {
@@ -2924,24 +2937,32 @@ function defineResource(definition) {
29242937 Resource . prototype = this . defaults ;
29252938 this . definitions [ definition . name ] = new Resource ( this . utils , definition ) ;
29262939
2927- var _this = this ;
2940+ var _this = this ,
2941+ def = this . definitions [ definition . name ] ;
29282942
2929- var cache = this . cacheFactory ( 'DS.' + definition . name , {
2930- maxAge : definition . maxAge || null ,
2931- recycleFreq : definition . recycleFreq || 1000 ,
2932- cacheFlushInterval : definition . cacheFlushInterval || null ,
2933- deleteOnExpire : definition . deleteOnExpire || 'none' ,
2943+ var cache = this . cacheFactory ( 'DS.' + def . name , {
2944+ maxAge : def . maxAge || null ,
2945+ recycleFreq : def . recycleFreq || 1000 ,
2946+ cacheFlushInterval : def . cacheFlushInterval || null ,
2947+ deleteOnExpire : def . deleteOnExpire || 'none' ,
29342948 onExpire : function ( id ) {
2935- _this . eject ( definition . name , id ) ;
2949+ _this . eject ( def . name , id ) ;
29362950 } ,
29372951 capacity : Number . MAX_VALUE ,
29382952 storageMode : 'memory' ,
29392953 storageImpl : null ,
29402954 disabled : false ,
2941- storagePrefix : 'DS.' + definition . name
2955+ storagePrefix : 'DS.' + def . name
29422956 } ) ;
29432957
2944- this . store [ definition . name ] = {
2958+ if ( def . methods ) {
2959+ def . class = definition . name [ 0 ] . toUpperCase ( ) + definition . name . substring ( 1 ) ;
2960+ eval ( 'function ' + def . class + '() {}' ) ;
2961+ def [ def . class ] = eval ( def . class ) ;
2962+ this . utils . deepMixIn ( def [ def . class ] . prototype , def . methods ) ;
2963+ }
2964+
2965+ this . store [ def . name ] = {
29452966 collection : [ ] ,
29462967 completedQueries : { } ,
29472968 pendingQueries : { } ,
@@ -3648,11 +3669,12 @@ function _inject(definition, resource, attrs) {
36483669 if ( ! ( definition . idAttribute in attrs ) ) {
36493670 throw new _this . errors . RuntimeError ( errorPrefix + 'attrs: Must contain the property specified by `idAttribute`!' ) ;
36503671 } else {
3672+ definition . beforeInject ( definition . name , attrs ) ;
36513673 var id = attrs [ definition . idAttribute ] ,
36523674 item = this . get ( definition . name , id ) ;
36533675
36543676 if ( ! item ) {
3655- item = { } ;
3677+ item = definition . class ? new definition [ definition . class ] ( ) : { } ;
36563678 resource . previousAttributes [ id ] = { } ;
36573679
36583680 _this . utils . deepMixIn ( item , attrs ) ;
@@ -3676,6 +3698,7 @@ function _inject(definition, resource, attrs) {
36763698 resource . observers [ id ] . deliver ( ) ;
36773699 }
36783700 resource . saved [ id ] = _this . utils . updateTimestamp ( resource . saved [ id ] ) ;
3701+ definition . afterInject ( definition . name , item ) ;
36793702 }
36803703 }
36813704}
@@ -3748,7 +3771,11 @@ function inject(resourceName, attrs, options) {
37483771 } else {
37493772 _inject . apply ( _this , [ definition , resource , attrs ] ) ;
37503773 }
3751- return attrs ;
3774+ if ( _this . utils . isArray ( attrs ) ) {
3775+ return attrs ;
3776+ } else {
3777+ return this . get ( resourceName , attrs [ definition . idAttribute ] ) ;
3778+ }
37523779 } catch ( err ) {
37533780 if ( ! ( err instanceof this . errors . RuntimeError ) ) {
37543781 throw new this . errors . UnhandledError ( err ) ;
0 commit comments