babelute
Version:
Internal Domain Specific (Multi)Modeling javascript framework
71 lines (60 loc) • 2.29 kB
JavaScript
/*
* @Author: Gilles Coomans
* @Date: 2017-03-10 13:25:25
* @Last Modified by: Gilles Coomans
* @Last Modified time: 2017-05-10 11:03:28
*/
import assert from 'assert'; // removed in production
import Babelute from '../babelute';
import extend from '../utils/extends';
/**
* Initializer Class
* @protected
*/
class Initializer {}
/**
* extends Initializer
* @param {Class} BaseInitializer the Initializer to extends
* @return {Class} the extended Initalizer class
*/
Initializer.extends = extend;
/**
* create a Initializer (based on a Babelute subclass) and instanciate it
* @param {Babelute} BabeluteClass a Babelute subclass from where create initializer
* @param {?Initializer} BaseInitializer a parent initializer to be extended (optional)
* @return {Initializer} the Initializer instance
* @protected
*/
function createInitializer(BabeluteClass, BaseInitializer = null) {
assert(BabeluteClass === Babelute || (BabeluteClass.prototype instanceof Babelute), 'Lexicon createInitializer accepts only a Babelute Class (or subclass) as first argument');
assert(!BaseInitializer || BaseInitializer === Initializer || (BaseInitializer.prototype instanceof Initializer), 'Lexicon createInitializer accepts only a Initializer Class (or subclass) as second argument');
const Init = BabeluteClass.Initializer = BaseInitializer ? Initializer.extends(BaseInitializer) : Initializer;
BabeluteClass.initializer = new Init();
BabeluteClass.initializer._empty = function() {
return new BabeluteClass();
};
BabeluteClass.initializer.Class = BabeluteClass;
Object.keys(BabeluteClass).forEach((i) => addToInitializer(Init, i));
return BabeluteClass.initializer;
}
/**
* add method to initializer
* @protected
* @param {Initializer} Initializer Initializer class where add methods in proto
* @param {string} methodName the name of method to add
*/
function addToInitializer(Initializer, methodName) {
Initializer.prototype[methodName] = function() {
return new this.Class()[methodName](...arguments);
};
}
// add base Babelute's api
['_use', '_each', '_if', '_append', '_lexicon']
.forEach((methodName) => {
addToInitializer(Initializer, methodName);
});
export {
Initializer,
createInitializer,
addToInitializer
};