moko
Version:
Generator based models
49 lines (43 loc) • 1.36 kB
JavaScript
var co = require('co'),
Emitter = require('co-emitter'),
clone = require('./utils/clone.js');
/* jshint esnext: true */
module.exports = function(Moko) {
Emitter(Moko);
Moko.validate = function(gen) {
Moko._validators.push(gen);
return Moko;
};
Moko.attr = function(attr, opts) {
opts = opts || {};
Moko.attrs[attr] = Moko.attrs[attr] || {};
for(var key in opts) {
Moko.attrs[attr][key] = opts[key];
}
var primaries = ['_id', 'id'];
if((~primaries.indexOf(attr) && !Moko._primary) || opts.primary)
Moko._primary = attr;
if(!Moko.prototype.hasOwnProperty(attr)) {
Object.defineProperty(Moko.prototype, attr, {
get: function() {
return this._attrs[attr];
},
set: function(val) {
var old = this._attrs[attr];
val = clone(val);
var changed = Array.isArray(val) || typeof val == 'object' || old !== val;
if(changed) {
this._attrs[attr] = val;
this._dirty[attr] = val;
this.model.emit('change', this, attr, val, old);
this.model.emit('change ' + attr, this, val, old);
this.emit('change', attr, val, old);
this.emit('change ' + attr, val, old);
}
}
});
Moko.emit('attr', attr, opts);
}
return Moko;
};
};