Created
February 11, 2017 15:19
-
-
Save bartread/ee632195cdc1a40e5909abf05f96547e to your computer and use it in GitHub Desktop.
Pinjector injector - somewhat Angular 1.x-ish, but I was too lazy to support modules properly
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; // jshint ignore:line | |
var pinjector = {}; | |
(function () { | |
pinjector.module = module; | |
var modules = {}; | |
function module(name) { | |
var controllers = {}; | |
var factories = {}; | |
var module = modules[name]; | |
if (!module) { | |
module = { | |
controller: controller, | |
factory: factory, | |
run: run, | |
getController: getController, | |
getFactory: getFactory | |
}; | |
modules[name] = module; | |
} | |
return module; | |
function controller(constructorName, params) { | |
controllers[constructorName] = { | |
name: constructorName, | |
params: params, | |
controller: params[params.length -1] | |
}; | |
} | |
function factory(constructorName, params) { | |
factories[constructorName] = { | |
name: constructorName, | |
params: params, | |
constructor: params[params.length -1] | |
}; | |
} | |
function run(controllerName) { | |
resolve(); | |
var controllerDefinition = controllers[controllerName];//module.getController(controllerName); | |
if (!controllerDefinition) { | |
throw 'Specified controller "' + controllerName + '" is not registered. Unable to run.'; | |
} | |
var main = controllerDefinition.controller.main; | |
if (!main) { | |
throw 'Controller "' + controllerName + '" doesn\'t export a main function. Unable to run.'; | |
} | |
main(); | |
} | |
function getController(controllerName) { | |
return controllers[controllerName].controller; | |
} | |
function getFactory(factoryName) { | |
return resolveFactoryName(factoryName); | |
} | |
function resolve() { | |
for (var propName in factories) { | |
if (!factories.hasOwnProperty(propName)) { | |
continue; | |
} | |
resolveFactoryName(propName); | |
} | |
resolveControllerDependencies(); | |
} | |
function resolveControllerDependencies() { | |
for (var propName in controllers) { | |
if (!controllers.hasOwnProperty(propName)) { | |
continue; | |
} | |
var controllerDefinition = controllers[propName]; | |
resolveFactoryDefinition(controllerDefinition); | |
} | |
} | |
function resolveFactoryName(factoryName) { | |
var definition = factories[factoryName]; | |
if (definition) { | |
return resolveFactoryDefinition(definition); | |
} | |
return null; | |
} | |
function resolveFactoryDefinition(factoryDefinition) { | |
if (factoryDefinition.factory) { | |
return factoryDefinition.factory; | |
} | |
var dependencies = []; | |
var size = factoryDefinition.params.length - 1; | |
for (var index = 0; index < size; ++index) { | |
var name = factoryDefinition.params[index]; | |
var dependency = resolveFactoryName(name); | |
if (dependency) { | |
dependencies.push(dependency); | |
} else { | |
throw 'Unable to resolve dependency "' + | |
name + | |
'" for factory "' + | |
factoryDefinition.name + | |
'".'; | |
} | |
} | |
var constructor = factoryDefinition.params[size]; | |
var factory = constructor.apply(constructor, dependencies); | |
factoryDefinition.factory = factory; | |
return factory; | |
} | |
} | |
}()); | |
/* | |
This code is licensed under the terms of the MIT License as described | |
in LICENSE.txt. | |
Copyright (c) 2015 - 2017 Bart Read, arcade.ly (https://arcade.ly), | |
and bartread.com Ltd (http://www.bartread.com/) | |
The pinjector is loosely based on a limited subset of the Angular 1.x | |
module API and injector that is used for service registration and | |
dependency injection by games at http://arcade.ly. It exists because | |
the first game was initially implemented using AngularJS until Bart | |
experience a moment of clarity in which he realised this was an | |
insane thing to use Angular for but couldn't be bothered with the | |
faff of switching everything over to a different module system and | |
API. | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment