From 141c4d0d249c7472fa452c8a5fa0e6e1b09ee53d Mon Sep 17 00:00:00 2001 From: ben hockey Date: Thu, 2 Jun 2011 15:28:32 -0400 Subject: [PATCH] added factory fiber - useful for dynamically resolving components --- lib/factory/Fiber.js | 57 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 lib/factory/Fiber.js diff --git a/lib/factory/Fiber.js b/lib/factory/Fiber.js new file mode 100644 index 0000000..df9d210 --- /dev/null +++ b/lib/factory/Fiber.js @@ -0,0 +1,57 @@ +/** + * @license Copyright (c) 2011 Cello Software, LLC. + * All rights reserved. + * Available via the new BSD License. + */ +/*jshint + bitwise: false, curly: true, eqeqeq: true, forin: true, immed: true, indent: 4, maxlen: 100, + newcap: true, noarg: true, noempty: true, onevar: true, passfail: false, strict: true, + undef: true, white: true +*/ +/*global define: false, require: false */ + +define([ + 'compose', + 'lang', + 'promise', + 'dojo/_base/array' +], function (compose, lang, promise, array) { + 'use strict'; + return compose(function FactoryFiber() { + this._listeners = []; + }, { + id: 'Factory Fiber', + + init: function (kernel) { + this.kernel = kernel; + kernel.modelBuilder.addProcessor(this); + }, + + process: function (model, next) { + var kernel = this.kernel; + return promise.when(model, function (model) { + var factory = model.factory, + module = {}; + + if (factory) { + // model.factory is a map of + // propertyName -> moduleId + // instance.propertyName will be a factory for a moduleId + array.forEach(lang.keys(factory), function (property) { + module[property] = function (args) { + return kernel.resolve(factory[property], args); + }; + }); + model.module = module; + } + }); + }, + + terminate: function () { + // stop all the listeners + array.forEach(this._listeners, function (listener) { + listener.remove(); + }); + } + }); +});