new BuilderApi()
Provides the DSL for model generation, it supports to modes of model definitions:
Definition object
This is the preferred way of describing a model behavior.
A model description object looks like this:
restmod.model({
// MODEL CONFIGURATION
$config: {
name: 'resource',
primaryKey: '_id'
},
// ATTRIBUTE MODIFIERS AND RELATIONS
propWithDefault: { init: 20 },
propWithDecoder: { decode: 'date', chain: true },
hasManyRelation: { hasMany: 'Other' },
hasOneRelation: { hasOne: 'Other' },
// HOOKS
$hooks: {
'after-create': function() {
}
},
// METHODS
$extend: {
Record: {
instanceMethod: function() {
}
},
Model: {
scopeMethod: function() {
}
}
}
});
Special model configuration variables can be set by using a $config block:
restmod.model({
$config: {
name: 'resource',
primaryKey: '_id'
}
});
With the exception of model configuration variables and properties starting with a special character (@ or ~), each property in the definition object asigns a behavior to the same named property in a model's record.
To modify a property behavior assign an object with the desired modifiers to a definition property with the same name. Builtin modifiers are:
The following built in property modifiers are provided (see each mapped-method docs for usage information):
initsets an attribute default value, see BuilderApi#attrDefaultmaskandignoresets an attribute mask, see BuilderApi#attrMaskmapsets an explicit server attribute mapping, see BuilderApi#attrMapdecodesets how an attribute is decoded after being fetch, maps to BuilderApi#attrDecoderencodesets how an attribute is encoded before being sent, maps to BuilderApi#attrEncodervolatilesets the attribute volatility, maps to BuilderApi#attrVolatile
For relations modifiers take a look at RelationBuilderApi
For other extended bundled methods check out the ExtendedBuilderApi
If other kind of value (different from object or function) is passed to a definition property, then it is considered to be a default value. (same as calling BuilderApi#define at a definition function)
var Model = restmod.model('/', {
im20: 20 // same as { init: 20 }
})
// then say hello is available for use at model records
Model.$new().im20; // 20
To add/override methods from the record api, use the $extend block:
var Model = restmod.model('/', {
$extend: {
sayHello: function() { alert('hello!'); }
}
})
// then say hello is available for use at model records
Model.$new().sayHello();
To add a static method or a collection method, you must specify the method scope: , prefix the definition key with ^, to add it to the model collection prototype, prefix it with * static/collection methods to the Model, prefix the definition property name with @ (same as calling BuilderApi#scopeDefine at a definition function).
var Model = restmod.model('/', {
$extend: {
'Collection.count': function() { return this.length; }, // scope is set using a prefix
Model: {
sayHello: function() { alert('hello!'); } // scope is set using a block
}
})
// then the following call will be valid.
Model.sayHello();
Model.$collection().count();
More information about method scopes can be found in BuilderApi#define
To add hooks to the Model lifecycle events use the $hooks block:
var Model = restmod.model('/', {
$hooks: {
'after-init': function() { alert('hello!'); }
}
})
// the after-init hook is called after every record initialization.
Model.$new(); // alerts 'hello!';
Definition function
The definition function gives complete access to the model builder api, every model builder function described in this page can be called from the definition function by referencing this.
restmod.model('', function() {
this.attrDefault('propWithDefault', 20)
.attrAsCollection('hasManyRelation', 'ModelName')
.on('after-create', function() {
// do something after create.
});
});
- Source:
- module/builder.js, line 14
Methods
-
attrComputed(_attr, _fn) → {BuilderApi}
-
Sets a computed value for an attribute.
Computed values are set only on object construction phase. Computed values are always masked
Parameters:
Name Type Description _attrstring Attribute name
_fnfunction Function that returns value
- Source:
- module/factory.js, line 497
Returns:
self
- Type
- BuilderApi
-
attrDecoder(_name, _filter, _filterParam, _chain) → {BuilderApi}
-
Assigns a decoding function/filter to a given attribute.
Parameters:
Name Type Description _namestring Attribute name
_filterstring | function filter or function to register
_filterParammixed Misc filter parameter
_chainboolean If true, filter is chained to the current attribute filter.
- Source:
- module/serializer.js, line 276
Returns:
self
- Type
- BuilderApi
-
attrDefault(_attr, _init) → {BuilderApi}
-
Sets the default value for an attribute.
Defaults values are set only on object construction phase.
if
_initis a function, then its evaluated every time the default value is required.Parameters:
Name Type Description _attrstring Attribute name
_initmixed Defaulf value / iniline function
- Source:
- module/factory.js, line 480
Returns:
self
- Type
- BuilderApi
-
attrEncoder(_name, _filter, _filterParam, _chain) → {BuilderApi}
-
Assigns a encoding function/filter to a given attribute.
Parameters:
Name Type Description _namestring Attribute name
_filterstring | function filter or function to register
_filterParammixed Misc filter parameter
_chainboolean If true, filter is chained to the current attribute filter.
- Source:
- module/serializer.js, line 298
Returns:
self
- Type
- BuilderApi
-
attribute(_name, _description) → {BuilderApi}
-
Sets an attribute properties.
This method uses the attribute modifiers mapping to call proper modifiers on the argument.
For example, using the following description on the createdAt attribute
{ decode: 'date', param; 'YY-mm-dd' }
Is the same as calling
builder.attrDecoder('createdAt', 'date', 'YY-mm-dd')
Parameters:
Name Type Description _namestring Attribute name
_descriptionobject Description object
- Source:
- module/builder.js, line 296
Returns:
self
- Type
- BuilderApi
-
attrMap(_attr, _serverName) → {BuilderApi}
-
Sets an attribute mapping.
Allows a explicit server to model property mapping to be defined.
For example, to map the response property
stats.created_atto model'screatedproperty.builder.attrMap('created', 'stats.created_at');It's also posible to use a wildcard '*' as server name to use the default name decoder as server name. This is used to force a property to be processed on decode/encode even if its not present on request/record (respectively), by doing this its posible, for example, to define a dynamic property that is generated automatically before the object is send to the server.
Parameters:
Name Type Description _attrstring Attribute name
_serverNamestring Server (request/response) property name
- Source:
- module/serializer.js, line 218
Returns:
self
- Type
- BuilderApi
-
attrMask(_attr, _mask) → {BuilderApi}
-
Sets an attribute mask.
An attribute mask prevents the attribute to be loaded from or sent to the server on certain operations.
The attribute mask is a string composed by: C: To prevent attribute from being sent on create R: To prevent attribute from being loaded from server * U: To prevent attribute from being sent on update
For example, the following will prevent an attribute to be send on create or update:
builder.attrMask('readOnly', 'CU');If a true boolean value is passed as mask, then 'CRU' will be used If a false boolean valus is passed as mask, then mask will be removed
Parameters:
Name Type Description _attrstring Attribute name
_maskboolean | string Attribute mask
- Source:
- module/serializer.js, line 256
Returns:
self
- Type
- BuilderApi
-
attrMeta(_name, _metadata) → {BuilderApi}
-
Registers attribute metadata.
Parameters:
Name Type Description _namestring Attribute name
_metadataobject Attribute metadata
- Source:
- module/factory.js, line 512
Returns:
self
- Type
- BuilderApi
-
attrVolatile(_name, _isVolatile) → {BuilderApi}
-
Makes an attribute volatile, a volatile attribute is deleted from source after encoding.
Parameters:
Name Type Description _namestring Attribute name
_isVolatileboolean defaults to true, if set to false then the attribute is no longer volatile.
- Source:
- module/serializer.js, line 318
Returns:
self
- Type
- BuilderApi
-
define(_where, _fun, _api) → {BuilderApi}
-
Adds methods to the model
This method allows to extend the different model API's.
The following API's can be extended using this method: Model: The static API, affects the Model object itself. Record: Affects each record generated by the model. Collection: Affects each collection generated by the model. Scope: Affects both the static API and collections. * Resource: Affects records and collections.
If no api is given
If no scope is given, By default this method extends the Record prototype. If called with an object instead of a function it can be used to extend the collection and the type with specific implementations.
Usage:
restmod.mixin(function() { this.define('myRecordMethod', function() {}) .define('Model.myStaticMethod', function() {}) .define('Collection', { }); // object to extend collection api with });It is posible to override an existing method using define, if overriden, the old method can be called using
this.$superinside de new method.Parameters:
Name Type Description _wherestring _funfunction Function to define or object with particular implementations
_apistring One of the api names listed above, if not given defaults to 'Record'
- Source:
- module/factory.js, line 558
Returns:
self
- Type
- BuilderApi
-
describe(_description) → {BuilderApi}
-
Parses a description object, calls the proper builder method depending on each property description type.
Parameters:
Name Type Description _descriptionobject The description object
- Source:
- module/builder.js, line 198
Returns:
self
- Type
- BuilderApi
-
extend(_name, _fun, _mapping) → {BuilderApi}
-
Extends the builder DSL
Adds a function to de builder and alternatively maps the function to an attribute definition keyword that can be later used when calling
defineorattribute.Mapping works as following:
// Given the following call builder.extend('testAttr', function(_attr, _test, _param1, param2) { // wharever.. }, ['test', 'testP1', 'testP2']);
// A call to builder.attribute('chapter', { test: 'hello', testP1: 'world' });
// Its equivalent to builder.testAttr('chapter', 'hello', 'world');
The method can also be passed an object with various methods to be added.
Parameters:
Name Type Description _namestring | object function name or object to merge
_funfunction function
_mappingarray function mapping definition
- Source:
- module/builder.js, line 265
Returns:
self
- Type
- BuilderApi
-
on(_hook, _do) → {BuilderApi}
-
Adds an event hook
Hooks are used to extend or modify the model behavior, and are not designed to be used as an event listening system.
The given function is executed in the hook's context, different hooks make different parameters available to callbacks.
Parameters:
Name Type Description _hookstring The hook name, refer to restmod docs for builtin hooks.
_dofunction function to be executed
- Source:
- module/factory.js, line 611
Returns:
self
- Type
- BuilderApi