changeset 3:00779cb63b12

formatting
author cin
date Tue, 06 Jun 2017 19:45:32 +0300
parents 7d7059d2a810
children fcc63f34d0a2
files src/implab/Uri.js src/implab/Uuid.js src/implab/components/ActivationController.js src/implab/components/ConsoleLogChannel.js src/implab/components/_ActivatableMixin.js src/implab/components/_LogMixin.js src/implab/di/ActivationContext.js src/implab/di/Container.js src/implab/di/ServiceDescriptor.js src/implab/guard.js src/implab/safe.js
diffstat 11 files changed, 374 insertions(+), 468 deletions(-) [+]
line wrap: on
line diff
--- a/src/implab/Uri.js	Fri Jun 02 19:28:20 2017 +0300
+++ b/src/implab/Uri.js	Tue Jun 06 19:45:32 2017 +0300
@@ -1,5 +1,5 @@
 define(
-    [ "dojo/_base/declare" ],
+    [ "./declare" ],
     function(declare) {
         function parseURI(uri) {
             var schema, host, port, path, query, hash, i;
--- a/src/implab/Uuid.js	Fri Jun 02 19:28:20 2017 +0300
+++ b/src/implab/Uuid.js	Tue Jun 06 19:45:32 2017 +0300
@@ -2,279 +2,277 @@
 //
 //     Copyright (c) 2010-2012 Robert Kieffer
 //     MIT License - http://opensource.org/licenses/mit-license.php
-define(
-    [],
-    function () {
-        'use strict';
+define([], function () {
+    'use strict';
 
-        var _window = 'undefined' !== typeof window ? window : null;
+    var _window = 'undefined' !== typeof window ? window : null;
 
-        // Unique ID creation requires a high quality random # generator. We
-        // feature
-        // detect to determine the best RNG source, normalizing to a function
-        // that
-        // returns 128-bits of randomness, since that's what's usually required
-        var _rng, _mathRNG, _nodeRNG, _whatwgRNG, _previousRoot;
+    // Unique ID creation requires a high quality random # generator. We
+    // feature
+    // detect to determine the best RNG source, normalizing to a function
+    // that
+    // returns 128-bits of randomness, since that's what's usually required
+    var _rng, _mathRNG, _nodeRNG, _whatwgRNG, _previousRoot;
 
-        function setupBrowser() {
-            // Allow for MSIE11 msCrypto
-            var _crypto = _window.crypto || _window.msCrypto;
+    function setupBrowser() {
+        // Allow for MSIE11 msCrypto
+        var _crypto = _window.crypto || _window.msCrypto;
 
-            if (!_rng && _crypto && _crypto.getRandomValues) {
-                // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto
-                //
-                // Moderately fast, high quality
-                try {
-                    var _rnds8 = new Uint8Array(16);
-                    _whatwgRNG = _rng = function whatwgRNG() {
-                        _crypto.getRandomValues(_rnds8);
-                        return _rnds8;
-                    };
-                    _rng();
-                } catch (e) { /**/ }
-            }
+        if (!_rng && _crypto && _crypto.getRandomValues) {
+            // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto
+            //
+            // Moderately fast, high quality
+            try {
+                var _rnds8 = new Uint8Array(16);
+                _whatwgRNG = _rng = function whatwgRNG() {
+                    _crypto.getRandomValues(_rnds8);
+                    return _rnds8;
+                };
+                _rng();
+            } catch (e) { /**/ }
+        }
 
-            if (!_rng) {
-                // Math.random()-based (RNG)
-                //
-                // If all else fails, use Math.random(). It's fast, but is of
-                // unspecified
-                // quality.
-                var _rnds = new Array(16);
-                _mathRNG = _rng = function () {
-                    for (var i = 0, r; i < 16; i++) {
-                        if ((i & 0x03) === 0) {
-                            r = Math.random() * 0x100000000;
-                        }
-                        _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;
+        if (!_rng) {
+            // Math.random()-based (RNG)
+            //
+            // If all else fails, use Math.random(). It's fast, but is of
+            // unspecified
+            // quality.
+            var _rnds = new Array(16);
+            _mathRNG = _rng = function () {
+                for (var i = 0, r; i < 16; i++) {
+                    if ((i & 0x03) === 0) {
+                        r = Math.random() * 0x100000000;
                     }
+                    _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;
+                }
 
-                    return _rnds;
-                };
-                if ('undefined' !== typeof console && console.warn) {
-                    console
-                        .warn("[SECURITY] node-uuid: crypto not usable, falling back to insecure Math.random()");
-                }
+                return _rnds;
+            };
+            if ('undefined' !== typeof console && console.warn) {
+                console
+                    .warn("[SECURITY] node-uuid: crypto not usable, falling back to insecure Math.random()");
             }
         }
+    }
 
-        function setupNode() {
-            // Node.js crypto-based RNG -
-            // http://nodejs.org/docs/v0.6.2/api/crypto.html
-            //
-            // Moderately fast, high quality
-            if ('function' === typeof require) {
-                try {
-                    var _rb = require('crypto').randomBytes;
-                    _nodeRNG = _rng = _rb && function () {
-                        return _rb(16);
-                    };
-                    _rng();
-                } catch (e) { /**/ }
+    function setupNode() {
+        // Node.js crypto-based RNG -
+        // http://nodejs.org/docs/v0.6.2/api/crypto.html
+        //
+        // Moderately fast, high quality
+        if ('function' === typeof require) {
+            try {
+                var _rb = require('crypto').randomBytes;
+                _nodeRNG = _rng = _rb && function () {
+                    return _rb(16);
+                };
+                _rng();
+            } catch (e) { /**/ }
+        }
+    }
+
+    if (_window) {
+        setupBrowser();
+    } else {
+        setupNode();
+    }
+
+    // Buffer class to use
+    var BufferClass = ('function' === typeof Buffer) ? Buffer : Array;
+
+    // Maps for number <-> hex string conversion
+    var _byteToHex = [];
+    var _hexToByte = {};
+    for (var i = 0; i < 256; i++) {
+        _byteToHex[i] = (i + 0x100).toString(16).substr(1);
+        _hexToByte[_byteToHex[i]] = i;
+    }
+
+    // **`parse()` - Parse a UUID into it's component bytes**
+    function parse(s, buf, offset) {
+        var i = (buf && offset) || 0,
+            ii = 0;
+
+        buf = buf || [];
+        s.toLowerCase().replace(/[0-9a-f]{2}/g, function (oct) {
+            if (ii < 16) { // Don't overflow!
+                buf[i + ii++] = _hexToByte[oct];
+            }
+        });
+
+        // Zero out remaining bytes if string was short
+        while (ii < 16) {
+            buf[i + ii++] = 0;
+        }
+
+        return buf;
+    }
+
+    // **`unparse()` - Convert UUID byte array (ala parse()) into a string**
+    function unparse(buf, offset) {
+        var i = offset || 0,
+            bth = _byteToHex;
+        return bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] +
+            bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' +
+            bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] +
+            bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] +
+            bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]];
+    }
+
+    // **`v1()` - Generate time-based UUID**
+    //
+    // Inspired by https://github.com/LiosK/UUID.js
+    // and http://docs.python.org/library/uuid.html
+
+    // random #'s we need to init node and clockseq
+    var _seedBytes = _rng();
+
+    // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit =
+    // 1)
+    var _nodeId = [
+        _seedBytes[0] | 0x01,
+        _seedBytes[1],
+        _seedBytes[2],
+        _seedBytes[3],
+        _seedBytes[4],
+        _seedBytes[5]
+    ];
+
+    // Per 4.2.2, randomize (14 bit) clockseq
+    var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;
+
+    // Previous uuid creation time
+    var _lastMSecs = 0,
+        _lastNSecs = 0;
+
+    // See https://github.com/broofa/node-uuid for API details
+    function v1(options, buf, offset) {
+        var i = buf && offset || 0;
+        var b = buf || [];
+
+        options = options || {};
+
+        var clockseq = (options.clockseq != null) ? options.clockseq : _clockseq;
+
+        // UUID timestamps are 100 nano-second units since the Gregorian
+        // epoch,
+        // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so
+        // time is handled internally as 'msecs' (integer milliseconds) and
+        // 'nsecs'
+        // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01
+        // 00:00.
+        var msecs = (options.msecs != null) ? options.msecs : new Date()
+            .getTime();
+
+        // Per 4.2.1.2, use count of uuid's generated during the current
+        // clock
+        // cycle to simulate higher resolution clock
+        var nsecs = (options.nsecs != null) ? options.nsecs : _lastNSecs + 1;
+
+        // Time since last uuid creation (in msecs)
+        var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs) / 10000;
+
+        // Per 4.2.1.2, Bump clockseq on clock regression
+        if (dt < 0 && options.clockseq == null) {
+            clockseq = clockseq + 1 & 0x3fff;
+        }
+
+        // Reset nsecs if clock regresses (new clockseq) or we've moved onto
+        // a new
+        // time interval
+        if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) {
+            nsecs = 0;
+        }
+
+        // Per 4.2.1.2 Throw error if too many uuids are requested
+        if (nsecs >= 10000) {
+            throw new Error(
+                'uuid.v1(): Can\'t create more than 10M uuids/sec');
+        }
+
+        _lastMSecs = msecs;
+        _lastNSecs = nsecs;
+        _clockseq = clockseq;
+
+        // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
+        msecs += 12219292800000;
+
+        // `time_low`
+        var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
+        b[i++] = tl >>> 24 & 0xff;
+        b[i++] = tl >>> 16 & 0xff;
+        b[i++] = tl >>> 8 & 0xff;
+        b[i++] = tl & 0xff;
+
+        // `time_mid`
+        var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;
+        b[i++] = tmh >>> 8 & 0xff;
+        b[i++] = tmh & 0xff;
+
+        // `time_high_and_version`
+        b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
+        b[i++] = tmh >>> 16 & 0xff;
+
+        // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
+        b[i++] = clockseq >>> 8 | 0x80;
+
+        // `clock_seq_low`
+        b[i++] = clockseq & 0xff;
+
+        // `node`
+        var node = options.node || _nodeId;
+        for (var n = 0; n < 6; n++) {
+            b[i + n] = node[n];
+        }
+
+        return buf ? buf : unparse(b);
+    }
+
+    // **`v4()` - Generate random UUID**
+
+    // See https://github.com/broofa/node-uuid for API details
+    function v4(options, buf, offset) {
+        // Deprecated - 'format' argument, as supported in v1.2
+        var i = buf && offset || 0;
+
+        if (typeof (options) === 'string') {
+            buf = (options === 'binary') ? new BufferClass(16) : null;
+            options = null;
+        }
+        options = options || {};
+
+        var rnds = options.random || (options.rng || _rng)();
+
+        // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
+        rnds[6] = (rnds[6] & 0x0f) | 0x40;
+        rnds[8] = (rnds[8] & 0x3f) | 0x80;
+
+        // Copy bytes to buffer, if provided
+        if (buf) {
+            for (var ii = 0; ii < 16; ii++) {
+                buf[i + ii] = rnds[ii];
             }
         }
 
-        if (_window) {
-            setupBrowser();
-        } else {
-            setupNode();
-        }
-
-        // Buffer class to use
-        var BufferClass = ('function' === typeof Buffer) ? Buffer : Array;
-
-        // Maps for number <-> hex string conversion
-        var _byteToHex = [];
-        var _hexToByte = {};
-        for (var i = 0; i < 256; i++) {
-            _byteToHex[i] = (i + 0x100).toString(16).substr(1);
-            _hexToByte[_byteToHex[i]] = i;
-        }
-
-        // **`parse()` - Parse a UUID into it's component bytes**
-        function parse(s, buf, offset) {
-            var i = (buf && offset) || 0,
-                ii = 0;
-
-            buf = buf || [];
-            s.toLowerCase().replace(/[0-9a-f]{2}/g, function (oct) {
-                if (ii < 16) { // Don't overflow!
-                    buf[i + ii++] = _hexToByte[oct];
-                }
-            });
-
-            // Zero out remaining bytes if string was short
-            while (ii < 16) {
-                buf[i + ii++] = 0;
-            }
-
-            return buf;
-        }
-
-        // **`unparse()` - Convert UUID byte array (ala parse()) into a string**
-        function unparse(buf, offset) {
-            var i = offset || 0,
-                bth = _byteToHex;
-            return bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] +
-                bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' +
-                bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] +
-                bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] +
-                bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]];
-        }
-
-        // **`v1()` - Generate time-based UUID**
-        //
-        // Inspired by https://github.com/LiosK/UUID.js
-        // and http://docs.python.org/library/uuid.html
-
-        // random #'s we need to init node and clockseq
-        var _seedBytes = _rng();
-
-        // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit =
-        // 1)
-        var _nodeId = [
-            _seedBytes[0] | 0x01,
-            _seedBytes[1],
-            _seedBytes[2],
-            _seedBytes[3],
-            _seedBytes[4],
-            _seedBytes[5]
-        ];
-
-        // Per 4.2.2, randomize (14 bit) clockseq
-        var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;
-
-        // Previous uuid creation time
-        var _lastMSecs = 0,
-            _lastNSecs = 0;
-
-        // See https://github.com/broofa/node-uuid for API details
-        function v1(options, buf, offset) {
-            var i = buf && offset || 0;
-            var b = buf || [];
-
-            options = options || {};
-
-            var clockseq = (options.clockseq != null) ? options.clockseq : _clockseq;
-
-            // UUID timestamps are 100 nano-second units since the Gregorian
-            // epoch,
-            // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so
-            // time is handled internally as 'msecs' (integer milliseconds) and
-            // 'nsecs'
-            // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01
-            // 00:00.
-            var msecs = (options.msecs != null) ? options.msecs : new Date()
-                .getTime();
-
-            // Per 4.2.1.2, use count of uuid's generated during the current
-            // clock
-            // cycle to simulate higher resolution clock
-            var nsecs = (options.nsecs != null) ? options.nsecs : _lastNSecs + 1;
-
-            // Time since last uuid creation (in msecs)
-            var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs) / 10000;
+        return buf || unparse(rnds);
+    }
 
-            // Per 4.2.1.2, Bump clockseq on clock regression
-            if (dt < 0 && options.clockseq == null) {
-                clockseq = clockseq + 1 & 0x3fff;
-            }
-
-            // Reset nsecs if clock regresses (new clockseq) or we've moved onto
-            // a new
-            // time interval
-            if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) {
-                nsecs = 0;
-            }
-
-            // Per 4.2.1.2 Throw error if too many uuids are requested
-            if (nsecs >= 10000) {
-                throw new Error(
-                    'uuid.v1(): Can\'t create more than 10M uuids/sec');
-            }
-
-            _lastMSecs = msecs;
-            _lastNSecs = nsecs;
-            _clockseq = clockseq;
-
-            // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
-            msecs += 12219292800000;
-
-            // `time_low`
-            var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
-            b[i++] = tl >>> 24 & 0xff;
-            b[i++] = tl >>> 16 & 0xff;
-            b[i++] = tl >>> 8 & 0xff;
-            b[i++] = tl & 0xff;
-
-            // `time_mid`
-            var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;
-            b[i++] = tmh >>> 8 & 0xff;
-            b[i++] = tmh & 0xff;
-
-            // `time_high_and_version`
-            b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
-            b[i++] = tmh >>> 16 & 0xff;
-
-            // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
-            b[i++] = clockseq >>> 8 | 0x80;
-
-            // `clock_seq_low`
-            b[i++] = clockseq & 0xff;
+    // Export public API
+    var uuid = function () {
+        return new String(v4());
+    };
+    uuid.v1 = v1;
+    uuid.v4 = v4;
+    uuid.create = v4;
+    uuid.empty = "00000000-0000-0000-0000-000000000000";
+    uuid.parse = parse;
+    uuid.unparse = unparse;
+    uuid.BufferClass = BufferClass;
+    uuid._rng = _rng;
+    uuid._mathRNG = _mathRNG;
+    uuid._nodeRNG = _nodeRNG;
+    uuid._whatwgRNG = _whatwgRNG;
 
-            // `node`
-            var node = options.node || _nodeId;
-            for (var n = 0; n < 6; n++) {
-                b[i + n] = node[n];
-            }
-
-            return buf ? buf : unparse(b);
-        }
-
-        // **`v4()` - Generate random UUID**
-
-        // See https://github.com/broofa/node-uuid for API details
-        function v4(options, buf, offset) {
-            // Deprecated - 'format' argument, as supported in v1.2
-            var i = buf && offset || 0;
-
-            if (typeof (options) === 'string') {
-                buf = (options === 'binary') ? new BufferClass(16) : null;
-                options = null;
-            }
-            options = options || {};
-
-            var rnds = options.random || (options.rng || _rng)();
-
-            // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
-            rnds[6] = (rnds[6] & 0x0f) | 0x40;
-            rnds[8] = (rnds[8] & 0x3f) | 0x80;
-
-            // Copy bytes to buffer, if provided
-            if (buf) {
-                for (var ii = 0; ii < 16; ii++) {
-                    buf[i + ii] = rnds[ii];
-                }
-            }
-
-            return buf || unparse(rnds);
-        }
-
-        // Export public API
-        var uuid = function () {
-            return new String(v4());
-        };
-        uuid.v1 = v1;
-        uuid.v4 = v4;
-        uuid.create = v4;
-        uuid.empty = "00000000-0000-0000-0000-000000000000";
-        uuid.parse = parse;
-        uuid.unparse = unparse;
-        uuid.BufferClass = BufferClass;
-        uuid._rng = _rng;
-        uuid._mathRNG = _mathRNG;
-        uuid._nodeRNG = _nodeRNG;
-        uuid._whatwgRNG = _whatwgRNG;
-
-        return uuid;
-    });
\ No newline at end of file
+    return uuid;
+});
\ No newline at end of file
--- a/src/implab/components/ActivationController.js	Fri Jun 02 19:28:20 2017 +0300
+++ b/src/implab/components/ActivationController.js	Tue Jun 06 19:45:32 2017 +0300
@@ -1,55 +1,53 @@
-define([ "dojo/_base/declare", "../guard", "../safe", "../log/_LogMixin" ],
-
-function(declare, guard, safe, _LogMixin) {
+define(["dojo/_base/declare", "../guard", "../safe", "../log/_LogMixin"], function (declare, guard, safe, _LogMixin) {
 	"use strict";
-	return declare([ _LogMixin ], {
+	return declare([_LogMixin], {
 
-		_current : null,
+		_current: null,
 
-		_pending : false,
+		_pending: false,
 
-		getCurrent : function() {
+		getCurrent: function () {
 			return this._current;
 		},
 
-		_start : function() {
+		_start: function () {
 			if (this._pending)
 				throw new Error("The activation/decativation is already pending");
 			this._pending = true;
 		},
 
-		_await : function(d) {
+		_await: function (d) {
 			var me = this;
-			return d.then(function(x) {
+			return d.then(function (x) {
 				me._pending = false;
 				return x;
-			}, function(e) {
+			}, function (e) {
 				me._pending = false;
 				throw e;
 			});
 		},
 
-		activate : function(component) {
+		activate: function (component) {
 			safe.argumentNotNull(component, "component");
 			var me = this;
 			if (component.getController() !== this)
 				throw new Error("The specified component doesn't belong to this controller");
 
-			return me._await(guard(me, "_start").then(function() {
+			return me._await(guard(me, "_start").then(function () {
 				me._activate(component);
 			}));
 		},
 
-		_activate : function(component) {
+		_activate: function (component) {
 			var me = this;
 			if (me._current === component)
 				return guard(false);
 
 			// before activation hook
-			return guard(me, "onActivating", [ component ]).then(function() {
+			return guard(me, "onActivating", [component]).then(function () {
 				// deactivate curent
 				if (me._current)
-					return me._current.deactivate(true).then(function() {
+					return me._current.deactivate(true).then(function () {
 						try {
 							me._current.onDeactivated();
 						} catch (err) {
@@ -65,9 +63,9 @@
 						me._current = null;
 
 					});
-			}).then(function() {
+			}).then(function () {
 				return component.activate(true);
-			}).then(function() {
+			}).then(function () {
 				me._current = component;
 				try {
 					me.onActivated(component);
@@ -86,21 +84,21 @@
 		 * @returns true - компонента была деактивирована, либо нет активной
 		 *          компоненты. false - запрос на деактивацию - отклонен.
 		 */
-		deactivate : function() {
+		deactivate: function () {
 			var me = this;
-			return me._await(guard(me,"_start").then(function() {
+			return me._await(guard(me, "_start").then(function () {
 				return me._deactivate();
 			}));
 		},
 
-		_deactivate : function() {
+		_deactivate: function () {
 			var me = this;
 			if (!me._current)
 				return guard(false);
 
-			return guard(me, "onDeactivating").then(function() {
+			return guard(me, "onDeactivating").then(function () {
 				return me._current.deactivate(true);
-			}).then(function() {
+			}).then(function () {
 				// HACK raise deactivated event
 				try {
 					me.onDeactivated(me._current);
@@ -111,16 +109,12 @@
 			});
 		},
 
-		onActivating : function(component) {
-		},
+		onActivating: function (component) {},
 
-		onDeactivating : function(component) {
-		},
+		onDeactivating: function (component) {},
 
-		onDeactivated : function(component, next) {
-		},
+		onDeactivated: function (component, next) {},
 
-		onActivated : function(component) {
-		}
+		onActivated: function (component) {}
 	});
 });
\ No newline at end of file
--- a/src/implab/components/ConsoleLogChannel.js	Fri Jun 02 19:28:20 2017 +0300
+++ b/src/implab/components/ConsoleLogChannel.js	Tue Jun 06 19:45:32 2017 +0300
@@ -1,30 +1,26 @@
-define(
-    [ "dojo/_base/declare", "../text/format" ],
-    function(declare, format) {
-        return declare(
-            null,
-            {
-                name : null,
+define(["dojo/_base/declare", "../text/format"], function (declare, format) {
+    return declare(null, {
+        name: null,
 
-                constructor : function(name) {
-                    this.name = name;
-                },
+        constructor: function (name) {
+            this.name = name;
+        },
+
+        log: function () {
+            console.log(this._makeMsg(arguments));
+        },
 
-                log : function() {
-                    console.log(this._makeMsg(arguments));
-                },
-
-                warn : function() {
-                    console.warn(this._makeMsg(arguments));
-                },
+        warn: function () {
+            console.warn(this._makeMsg(arguments));
+        },
 
-                error : function() {
-                    console.error(this._makeMsg(arguments));
-                },
+        error: function () {
+            console.error(this._makeMsg(arguments));
+        },
 
-                _makeMsg : function(args) {
-                    return this.name ? this.name + " " +
-                        format.apply(null, args) : format.apply(null, args);
-                }
-            });
-    });
\ No newline at end of file
+        _makeMsg: function (args) {
+            return this.name ? this.name + " " +
+                format.apply(null, args) : format.apply(null, args);
+        }
+    });
+});
\ No newline at end of file
--- a/src/implab/components/_ActivatableMixin.js	Fri Jun 02 19:28:20 2017 +0300
+++ b/src/implab/components/_ActivatableMixin.js	Tue Jun 06 19:45:32 2017 +0300
@@ -1,40 +1,38 @@
-define([ "dojo/_base/declare", "../guard", "./StateMachine", "../log/_LogMixin", ],
-
-function(declare, guard, StateMachine, _LogMixin) {
+define(["dojo/_base/declare", "../guard", "./StateMachine", "../log/_LogMixin", ], function (declare, guard, StateMachine, _LogMixin) {
 
 	var states = {
-		inactive : {
-			activate : "activating"
+		inactive: {
+			activate: "activating"
 		},
-		activating : {
-			success : "active",
-			failed : "inactive"
+		activating: {
+			success: "active",
+			failed: "inactive"
 		},
-		active : {
-			deactivate : "deactivating"
+		active: {
+			deactivate: "deactivating"
 		},
-		deactivating : {
-			success : "inactive",
-			failed : "active"
+		deactivating: {
+			success: "inactive",
+			failed: "active"
 		}
 	};
 
-	return declare([ _LogMixin ], {
-		_controller : null,
+	return declare([_LogMixin], {
+		_controller: null,
 
-		_active : null,
+		_active: null,
 
-		constructor : function() {
+		constructor: function () {
 			this._active = new StateMachine({
-				states : states,
-				initial : "inactive"
+				states: states,
+				initial: "inactive"
 			});
 		},
 
 		/**
 		 * @returns {Object} контроллер для активации текущей компоненты
 		 */
-		getController : function() {
+		getController: function () {
 			return this._controller;
 		},
 
@@ -42,18 +40,18 @@
 		 * @param {Object}
 		 *            v Контроллер для активации текущей компоненты
 		 */
-		setController : function(v) {
+		setController: function (v) {
 			this._controller = v;
 		},
 
 		/**
 		 * @returns {Boolean} текущая компонента активна
 		 */
-		isActive : function() {
+		isActive: function () {
 			return this._active.current == "active";
 		},
 
-		assertActive : function() {
+		assertActive: function () {
 			if (!this.isActive())
 				throw new Error("The object must be active to perform the operation");
 		},
@@ -68,20 +66,20 @@
 		 *            контроллера.
 		 * @return{Boolean} успешно/неуспешно
 		 */
-		activate : function(direct) {
+		activate: function (direct) {
 			var me = this;
 			if (!direct && this._controller)
-				return me._controller.activate(me).then(function() {
+				return me._controller.activate(me).then(function () {
 					me.onActivated();
 				});
 
 			me._active.move("activate");
-			return guard(me, "onActivating").then(function() {
+			return guard(me, "onActivating").then(function () {
 				me.log("Activated");
 				me._active.move("success");
 				if (!me._controller)
 					me.onActivated();
-			}, function(err) {
+			}, function (err) {
 				console.error(err);
 				me.error("Activation failed: {0}", err);
 				me._active.move("failed");
@@ -98,20 +96,20 @@
 		 *                 участия контроллера.
 		 * 
 		 */
-		deactivate : function(direct) {
+		deactivate: function (direct) {
 			var me = this;
 			if (!direct && me._controller)
-				return me._controller.deactivate(me).then(function() {
+				return me._controller.deactivate(me).then(function () {
 					me.onDeactivated();
 				});
 
 			me._active.move("deactivate");
-			return guard(me, "onDeactivating").then(function() {
+			return guard(me, "onDeactivating").then(function () {
 				me.log("Deactivated");
 				me._active.move("success");
 				if (!me._controller)
 					me.onDeactivated();
-			}, function(err) {
+			}, function (err) {
 				console.error(err);
 				me.error("Deactivation failed: {0}", err);
 				me.move("failed");
@@ -120,9 +118,9 @@
 
 		},
 
-		toogleActive : function() {
+		toogleActive: function () {
 			var me = this;
-			return (me.isActive() ? me.deactivate() : me.activate()).then(function() {
+			return (me.isActive() ? me.deactivate() : me.activate()).then(function () {
 				return me.isActive();
 			});
 		},
@@ -132,28 +130,24 @@
 		 * 
 		 * @returns{Boolean|undefined} если false - активация будет отменена
 		 */
-		onActivating : function() {
-		},
+		onActivating: function () {},
 
 		/**
 		 * Событие вызывается перед деактивацией текущей компоненты
 		 * 
 		 * @returns {Boolean|undefined} если false - деактивация будет отменена
 		 */
-		onDeactivating : function() {
-		},
+		onDeactivating: function () {},
 
 		/**
 		 * Событие вызывается после активации текущей компоненты
 		 */
-		onActivated : function() {
-		},
+		onActivated: function () {},
 
 		/**
 		 * Событие вызывается после деактивации текущей компоненты
 		 */
-		onDeactivated : function() {
-		}
+		onDeactivated: function () {}
 
 	});
 });
\ No newline at end of file
--- a/src/implab/components/_LogMixin.js	Fri Jun 02 19:28:20 2017 +0300
+++ b/src/implab/components/_LogMixin.js	Tue Jun 06 19:45:32 2017 +0300
@@ -1,12 +1,12 @@
-define([ "dojo/_base/declare" ],
-
-function(declare) {
+define([
+    "implab/declare", "implab/declare/override"
+], function (declare, override) {
     var cls = declare(null, {
-        _logChannel : null,
+        _logChannel: null,
 
-        _logLevel : 1,
+        _logLevel: 1,
 
-        constructor : function(opts) {
+        constructor: function (opts) {
             if (typeof opts == "object") {
                 if ("logChannel" in opts)
                     this._logChannel = opts.logChannel;
@@ -15,31 +15,31 @@
             }
         },
 
-        getLogChannel : function() {
+        getLogChannel: function () {
             return this._logChannel;
         },
 
-        setLogChannel : function(v) {
+        setLogChannel: function (v) {
             this._logChannel = v;
         },
 
-        getLogLevel : function() {
+        getLogLevel: function () {
             return this._logLevel;
         },
 
-        setLogLevel : function(v) {
+        setLogLevel: function (v) {
             this._logLevel = v;
         },
 
-        log : function(format) {
+        log: function () {
             if (this._logChannel && this._logLevel > 2)
                 this._logChannel.log.apply(this._logChannel, arguments);
         },
-        warn : function(format) {
+        warn: function () {
             if (this._logChannel && this._logLevel > 1)
                 this._logChannel.warn.apply(this._logChannel, arguments);
         },
-        error : function(format) {
+        error: function () {
             if (this._logChannel && this._logLevel > 0)
                 this._logChannel.error.apply(this._logChannel, arguments);
         },
@@ -47,21 +47,22 @@
         /**
          * Used to by widgets
          */
-        startup : function() {
-            var me = this, parent;
+        startup: override( /** @this */ function (inherited) {
+            var me = this,
+                parent;
             if (!me.getLogChannel()) {
                 parent = me;
-                while (parent = parent.getParent()) {
+                while ((parent = parent.getParent())) {
                     if (parent.getLogChannel) {
                         me.setLogChannel(parent.getLogChannel());
-                        if(parent.getLogLevel)
+                        if (parent.getLogLevel)
                             me.setLogLevel(parent.getLogLevel());
                         break;
                     }
                 }
             }
-            this.inherited(arguments);
-        }
+            return inherited();
+        })
     });
     return cls;
 });
\ No newline at end of file
--- a/src/implab/di/ActivationContext.js	Fri Jun 02 19:28:20 2017 +0300
+++ b/src/implab/di/ActivationContext.js	Tue Jun 06 19:45:32 2017 +0300
@@ -60,7 +60,7 @@
             clone: function () {
                 return new Context(
                     this.container,
-                    safe.create(this._services),
+                    Object.create(this._services),
                     this._cache,
                     this._visited
                 );
@@ -123,7 +123,7 @@
                     scope: this._services
                 });
                 if (localize)
-                    this._services = safe.create(this._services);
+                    this._services = Object.create(this._services);
             },
 
             leave: function () {
--- a/src/implab/di/Container.js	Fri Jun 02 19:28:20 2017 +0300
+++ b/src/implab/di/Container.js	Tue Jun 06 19:45:32 2017 +0300
@@ -29,7 +29,7 @@
 
         constructor: function (parent) {
             this._parent = parent;
-            this._services = parent ? safe.create(parent._services) : {};
+            this._services = parent ? Object.create(parent._services) : {};
             this._cache = {};
             this._cleanup = [];
             this._root = parent ? parent.getRootContainer() : this;
--- a/src/implab/di/ServiceDescriptor.js	Fri Jun 02 19:28:20 2017 +0300
+++ b/src/implab/di/ServiceDescriptor.js	Tue Jun 06 19:45:32 2017 +0300
@@ -218,7 +218,7 @@
                             };
                         } else if (this._params instanceof Array) {
                             this._factory = function () {
-                                var inst = safe.create(ctor.prototype);
+                                var inst = Object.create(ctor.prototype);
                                 var ret = ctor.apply(inst, arguments);
                                 return typeof (ret) === "object" ? ret : inst;
                             };
--- a/src/implab/guard.js	Fri Jun 02 19:28:20 2017 +0300
+++ b/src/implab/guard.js	Tue Jun 06 19:45:32 2017 +0300
@@ -1,4 +1,4 @@
-define([ "dojo/Deferred" ], function(Deferred) {
+define([ "./Deferred" ], function(Deferred) {
     var toPromise = function(d) {
         if (d && d.then)
             return d;
--- a/src/implab/safe.js	Fri Jun 02 19:28:20 2017 +0300
+++ b/src/implab/safe.js	Tue Jun 06 19:45:32 2017 +0300
@@ -1,84 +1,11 @@
 define([],
 
     function () {
-        var id = 0,
-            OID_FIELD = "__core_safe_oid_field",
-            _create, _defineProperty, _keys;
-
-        if (!Object.keys) {
-            _defineProperty = function (obj, prop, d) {
-                if (!d)
-                    throw new Error("Invalid descriptor");
-                obj[prop] = d.value;
-            };
-        } else {
-            _defineProperty = Object.defineProperty;
-        }
-
-        if (!Object.create) {
-            var tctor = function () {};
-            _create = function (proto) {
-                if (arguments.length > 1)
-                    throw new Error("The two arguments for isn't supported");
-
-                tctor.prototype = proto;
-                return new tctor();
-            };
-        } else {
-            _create = Object.create;
-        }
-
-        if (!Object.keys) {
-            // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys#Polyfill
-            _keys = (function () {
-                'use strict';
-                var hasOwnProperty = Object.prototype.hasOwnProperty,
-                    hasDontEnumBug = !({
-                        toString: null
-                    }).propertyIsEnumerable('toString'),
-                    dontEnums = [
-                        'toString',
-                        'toLocaleString',
-                        'valueOf',
-                        'hasOwnProperty',
-                        'isPrototypeOf',
-                        'propertyIsEnumerable',
-                        'constructor'
-                    ],
-                    dontEnumsLength = dontEnums.length;
-
-                return function (obj) {
-                    if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
-                        throw new TypeError('Object.keys called on non-object');
-                    }
-
-                    var result = [],
-                        prop, i;
-
-                    for (prop in obj) {
-                        if (prop != OID_FIELD && hasOwnProperty.call(obj, prop)) {
-                            result.push(prop);
-                        }
-                    }
-
-                    if (hasDontEnumBug) {
-                        for (i = 0; i < dontEnumsLength; i++) {
-                            if (hasOwnProperty.call(obj, dontEnums[i])) {
-                                result.push(dontEnums[i]);
-                            }
-                        }
-                    }
-                    return result;
-                };
-            }());
-        } else {
+        var _create = Object.create,
             _keys = Object.keys;
-        }
 
         var safe = null;
         safe = {
-            OID_FIELD: OID_FIELD,
-
             argumentNotNull: function (arg, name) {
                 if (arg === null || arg === undefined)
                     throw new Error("The argument " + name + " can't be null or undefined");
@@ -162,14 +89,6 @@
                 }
             },
 
-            oid: function (obj) {
-                return this.isPrimitive(obj) ? undefined : obj[OID_FIELD] ||
-                    (_defineProperty(obj, OID_FIELD, {
-                        value: ++id,
-                        enumerable: false
-                    }) && id);
-            },
-
             /**
              * Копирует свойства одного объекта в другой.
              * 
@@ -219,7 +138,11 @@
                 return dest;
             },
 
-            create: _create,
+            create: function () {
+                if (console && console.warn)
+                    console.warn("implab/safe::create is deprecated use Object.create instead");
+                _create.apply(this, arguments);
+            },
 
             delegate: function (target, method) {
                 if (!(method instanceof Function)) {
@@ -344,7 +267,7 @@
                         return cb ? cb(sequence[0]) : sequence[0];
                     }
                 }
-                
+
                 if (err)
                     return err(new Error("The sequence is required"));
                 else