UNPKG

tnt.api

Version:
185 lines (155 loc) 3.57 kB
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;