72 lines
1.9 KiB
JavaScript
72 lines
1.9 KiB
JavaScript
var HasProps, Model, _, p,
|
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
|
hasProp = {}.hasOwnProperty;
|
|
|
|
_ = require("underscore");
|
|
|
|
HasProps = require("./core/has_props");
|
|
|
|
p = require("./core/properties");
|
|
|
|
Model = (function(superClass) {
|
|
extend(Model, superClass);
|
|
|
|
function Model() {
|
|
return Model.__super__.constructor.apply(this, arguments);
|
|
}
|
|
|
|
Model.prototype.type = "Model";
|
|
|
|
Model.prototype._coords = [];
|
|
|
|
Model.coords = function(coords) {
|
|
var _coords, i, len, ref1, result, x, y;
|
|
_coords = this.prototype._coords.concat(coords);
|
|
this.prototype._coords = _coords;
|
|
result = {};
|
|
for (i = 0, len = coords.length; i < len; i++) {
|
|
ref1 = coords[i], x = ref1[0], y = ref1[1];
|
|
result[x] = [p.NumberSpec];
|
|
result[y] = [p.NumberSpec];
|
|
}
|
|
return this.define(result);
|
|
};
|
|
|
|
Model.define({
|
|
tags: [p.Array, []],
|
|
name: [p.String]
|
|
});
|
|
|
|
Model.prototype.select = function(selector) {
|
|
if (selector.prototype instanceof Model) {
|
|
return this.references().filter(function(ref) {
|
|
return ref instanceof selector;
|
|
});
|
|
} else if (_.isString(selector)) {
|
|
return this.references().filter(function(ref) {
|
|
return ref.name === selector;
|
|
});
|
|
} else {
|
|
throw new Error("invalid selector");
|
|
}
|
|
};
|
|
|
|
Model.prototype.select_one = function(selector) {
|
|
var result;
|
|
result = this.select(selector);
|
|
switch (result.length) {
|
|
case 0:
|
|
return null;
|
|
case 1:
|
|
return result[0];
|
|
default:
|
|
throw new Error("found more than one object matching given selector");
|
|
}
|
|
};
|
|
|
|
return Model;
|
|
|
|
})(HasProps);
|
|
|
|
module.exports = Model;
|