Source: instantiators/AbstractInstantiator.js

/**
 * Abstract class of all instantiator implementations. An Instantiator will create an instance of a module.
 * You cannot be sure, you get an actual instance of the object, since it could be possible to implement the module
 * as e.g. rpc module which wraps an API.
 * It will keep track of instances to react to circular dependencies.
 *
 * @author Wolfgang Felbermeier (@f3lang)
 */
class AbstractInstantiator {

	constructor() {
		this.requestCollection = [];
	}

	/**
	 * Will create a new instance of the requested module
	 * @param {string} path The file path of the module
	 * @param {object} config The injection config resolved by the module analyzer
	 * @param {string} root The tree to work in
	 * @param {string} requestId The unique request id to identify circular dependencies
	 */
	getInstance(path, config, root, requestId) {
		throw Error('This is an abstract class, use a derived class instead');
	}

	/**
	 * Will check, if the current request has already visited this stage once.
	 * @param {string} path The file path of the module
	 * @param {string} root The tree to work in
	 * @param {string} requestId The unique request id to identify circular dependencies
	 * @return {boolean} true, if a circular dependency occurred.
	 */
	requestIsCircular(path, root, requestId) {
		if(this.requestCollection.indexOf(requestId  + ':' +  path + ':' + root) > -1) {
			console.warn("Warning: circular dependency detected for " + requestId  + ':' +  path + ':' + root);
			return true;
		}
		this.requestCollection.push(requestId  + ':' +  path + ':' + root);
	}
}

module.exports = AbstractInstantiator;
module.exports.inject = [];