tnt.api
Version:
Api library for tnt
185 lines (155 loc) • 3.57 kB
JavaScript
var api = function (who) {
var _methods = function () {
var m = [];
m.add_batch = function (obj) {
m.unshift(obj);
};
m.update = function (method, value) {
for (var i=0; i<m.length; i++) {
for (var p in m[i]) {
if (p === method) {
m[i][p] = value;
return true;
}
}
}
return false;
};
m.add = function (method, value) {
if (m.update (method, value) ) {
} else {
var reg = {};
reg[method] = value;
m.add_batch (reg);
}
};
m.get = function (method) {
for (var i=0; i<m.length; i++) {
for (var p in m[i]) {
if (p === method) {
return m[i][p];
}
}
}
};
return m;
};
var methods = _methods();
var api = function () {};
api.check = function (method, check, msg) {
if (method instanceof Array) {
for (var i=0; i<method.length; i++) {
api.check(method[i], check, msg);
}
return;
}
if (typeof (method) === 'function') {
method.check(check, msg);
} else {
who[method].check(check, msg);
}
return api;
};
api.transform = function (method, cbak) {
if (method instanceof Array) {
for (var i=0; i<method.length; i++) {
api.transform (method[i], cbak);
}
return;
}
if (typeof (method) === 'function') {
method.transform (cbak);
} else {
who[method].transform(cbak);
}
return api;
};
var attach_method = function (method, opts) {
var checks = [];
var transforms = [];
var getter = opts.on_getter || function () {
return methods.get(method);
};
var setter = opts.on_setter || function (x) {
for (var i=0; i<transforms.length; i++) {
x = transforms[i](x);
}
for (var j=0; j<checks.length; j++) {
if (!checks[j].check(x)) {
var msg = checks[j].msg ||
("Value " + x + " doesn't seem to be valid for this method");
throw (msg);
}
}
methods.add(method, x);
};
var new_method = function (new_val) {
if (!arguments.length) {
return getter();
}
setter(new_val);
return who; // Return this?
};
new_method.check = function (cbak, msg) {
if (!arguments.length) {
return checks;
}
checks.push ({check : cbak,
msg : msg});
return this;
};
new_method.transform = function (cbak) {
if (!arguments.length) {
return transforms;
}
transforms.push(cbak);
return this;
};
who[method] = new_method;
};
var getset = function (param, opts) {
if (typeof (param) === 'object') {
methods.add_batch (param);
for (var p in param) {
attach_method (p, opts);
}
} else {
methods.add (param, opts.default_value);
attach_method (param, opts);
}
};
api.getset = function (param, def) {
getset(param, {default_value : def});
return api;
};
api.get = function (param, def) {
var on_setter = function () {
throw ("Method defined only as a getter (you are trying to use it as a setter");
};
getset(param, {default_value : def,
on_setter : on_setter}
);
return api;
};
api.set = function (param, def) {
var on_getter = function () {
throw ("Method defined only as a setter (you are trying to use it as a getter");
};
getset(param, {default_value : def,
on_getter : on_getter}
);
return api;
};
api.method = function (name, cbak) {
if (typeof (name) === 'object') {
for (var p in name) {
who[p] = name[p];
}
} else {
who[name] = cbak;
}
return api;
};
return api;
};
module.exports = exports = api;