bluzelle-binary-codec
Version:
bluzelle binary codec
83 lines (79 loc) • 2.04 kB
JavaScript
var _ = require('lodash');
var inherits = require('inherits');
function forEach(obj, func) {
Object.keys(obj || {}).forEach(function (k) {
func(obj[k], k);
});
}
function ensureArray(val) {
return Array.isArray(val) ? val : [val];
}
module.exports = function makeClass(klass_, definition_) {
var definition = definition_ || klass_;
var klass = typeof klass_ === 'function' ? klass_ : null;
if (klass === null) {
for (var k in definition) {
if (k[0].match(/[A-Z]/)) {
klass = definition[k];
break;
}
}
}
var parent = definition.inherits;
if (parent) {
if (klass === null) {
klass = function klass() {
parent.apply(this, arguments);
};
}
inherits(klass, parent);
_.defaults(klass, parent);
}
if (klass === null) {
klass = function klass() {};
}
var proto = klass.prototype;
function addFunc(original, name, wrapper) {
proto[name] = wrapper || original;
}
(definition.getters || []).forEach(function (k) {
var key = '_' + k;
proto[k] = function () {
return this[key];
};
});
forEach(definition.virtuals, function (f, n) {
addFunc(f, n, function () {
throw new Error('unimplemented');
});
});
forEach(definition.methods, addFunc);
forEach(definition, function (f, n) {
if (_.isFunction(f) && f !== klass) {
addFunc(f, n);
}
});
_.assign(klass, definition.statics);
if (typeof klass.init === 'function') {
klass.init();
}
forEach(definition.cached, function (f, n) {
var key = '_' + n;
addFunc(f, n, function () {
var value = this[key];
if (value === undefined) {
value = this[key] = f.call(this);
}
return value;
});
});
if (definition.mixins) {(function () {
var mixins = {};
// Right-most in the list win
ensureArray(definition.mixins).reverse().forEach(function (o) {
_.defaults(mixins, o);
});
_.defaults(proto, mixins);})();
}
return klass;
};
;