code: function $cache(key) {
      if ($cachedO.hasOwnProperty(key) === true) {
          // read cached entry
          var e = $cachedO[key];
          if (e.i < ($cachedE.length-1)) { // cached entry is not last one
  
              // move accessed entry to the list tail to increase its access weight
              var pn = $cachedE[e.i + 1];
              $cachedE[e.i]   = pn;
              $cachedE[++e.i] = key;
              $cachedO[pn].i--;
          }
          return e.o;
      }
  
      // don't cache global objects
      if ($global.hasOwnProperty(key)) {
          return $global[key];
      }
  
      var ctx = $global, i = 0, j = 0;
      for( ;ctx !== null && ctx !== undefined; ) {
          i = key.indexOf('.', j);
  
          if (i < 0) {
              ctx = ctx[key.substring(j, key.length)];
              break;
          }
  
          ctx = ctx[key.substring(j, i)];
          j = i + 1;
      }
  
      if (ctx !== null && ctx !== undefined) {
          if ($cachedE.length >= $cacheSize) {
              // cache is full, replace first element with the new one
              var n = $cachedE[0];
              $cachedE[0]   = key;
              $cachedO[key] = { o: ctx, i: 0 };
              delete $cachedO[n];
          } else {
              $cachedO[key] = { o: ctx, i: $cachedE.length };
              $cachedE[$cachedE.length] = key;
          }
          return ctx;
      }
  
      throw new Error("Reference '" + key + "' not found");
  }
docs: Get an object by the given key from cache (and cached it if necessary)
  @param  {String} key a key to an object. The key is hierarchical reference starting with the global
  name space as root. For instance "test.a" key will fetch $global.test.a object.
  @return {Object}  an object
  @for  zebkit
  @private
  @method  $cache