ReferenceDescriptor.js
89 lines
| 2.8 KiB
| application/javascript
|
JavascriptLexer
|
|
r0 | define([ | |
| "../declare", "../safe", "./Descriptor", "./ActivationError", "./ValueDescriptor" | |||
| ], | |||
| function(declare, safe, Descriptor, ActivationError, Value) { | |||
| return declare(Descriptor, { | |||
| _name : null, | |||
| _lazy : false, | |||
| _optional : false, | |||
| _default : undefined, | |||
| constructor : function(name, lazy, optional, def, services) { | |||
| safe.argumentNotEmptyString(name, "name"); | |||
| this._name = name; | |||
| this._lazy = Boolean(lazy); | |||
| this._optional = Boolean(optional); | |||
| this._default = def; | |||
| this._services = services; | |||
| }, | |||
| activate : function(context, name) { | |||
| var me = this; | |||
| context.enter(name, this, true); | |||
| // добавляем сервисы | |||
| if (me._services) { | |||
| for ( var p in me._services) { | |||
| var sv = me._services[p]; | |||
| context.register(p, sv instanceof Descriptor ? sv : new Value(sv, false)); | |||
| } | |||
| } | |||
| if (me._lazy) { | |||
| // сохраняем контекст активации | |||
| context = context.clone(); | |||
| return function(cfg) { | |||
| // защищаем контекст на случай исключения в процессе | |||
| // активации | |||
| var ct = context.clone(); | |||
| try { | |||
| if (cfg) | |||
| safe.each(cfg, function(v, k) { | |||
| ct.register(k, v instanceof Descriptor ? v : new Value(v, false)); | |||
| }); | |||
| return me._optional ? ct.getService(me._name, me._default) : ct | |||
| .getService(me._name); | |||
| } catch (error) { | |||
| throw new ActivationError(me._name, ct.getStack(), error); | |||
| } | |||
| }; | |||
| } | |||
| var v = me._optional ? context.getService(me._name, me._default) : context | |||
| .getService(me._name); | |||
| context.leave(me); | |||
| return v; | |||
| }, | |||
| isInstanceCreated : function() { | |||
| return false; | |||
| }, | |||
| toString : function() { | |||
| var opts = []; | |||
| if (this._optional) | |||
| opts.push("optional"); | |||
| if (this._lazy) | |||
| opts.push("lazy"); | |||
| var parts = [ | |||
| "@ref " | |||
| ]; | |||
| if (opts.length) { | |||
| parts.push("{"); | |||
| parts.push(opts.join()); | |||
| parts.push("} "); | |||
| } | |||
| parts.push(this._name); | |||
| if (!safe.isNull(this._default)) { | |||
| parts.push(" = "); | |||
| parts.push(this._default); | |||
| } | |||
| return parts.join(""); | |||
| } | |||
| }); | |||
| }); |
