You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

43 lines
1.1 KiB

'use strict';
/*!
* Register methods for this model
*
* @param {Model} model
* @param {Schema} schema
*/
module.exports = function applyMethods(model, schema) {
function apply(method, schema) {
Object.defineProperty(model.prototype, method, {
get: function() {
var h = {};
for (var k in schema.methods[method]) {
h[k] = schema.methods[method][k].bind(this);
}
return h;
},
configurable: true
});
}
for (var method in schema.methods) {
if (schema.tree.hasOwnProperty(method)) {
throw new Error('You have a method and a property in your schema both ' +
'named "' + method + '"');
}
if (typeof schema.methods[method] === 'function') {
model.prototype[method] = schema.methods[method];
} else {
apply(method, schema);
}
}
// Recursively call `applyMethods()` on child schemas
model.$appliedMethods = true;
for (var i = 0; i < schema.childSchemas.length; ++i) {
if (schema.childSchemas[i].model.$appliedMethods) {
continue;
}
applyMethods(schema.childSchemas[i].model, schema.childSchemas[i].schema);
}
};