'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); } };