docs: function inspectInstance(target, cache) {
          // If browser has no define property it means it is too old and
          // in that case we return the target itself.
          // This could be improved but I think it does not worth the trouble
          if (!hasDefineProperty) {
              return target;
          }
  
          var def,
              simpleConstructor,
              methodsCache,
              propertiesCache,
              obj,
              tmp,
              key;
  
          obj = fetchCache(target, cache.instances);
          if (obj) {
              return obj;
          }
  
          def = target.$static[$class];
          simpleConstructor = def.simpleConstructor;
          methodsCache = target[cacheKeyword].methods;
          propertiesCache = target[cacheKeyword].properties;
  
          obj = createObject(simpleConstructor.prototype);
          cache.instances.push({ target: target, inspect: obj });
  
          // Methods
          for (key in target[redefinedCacheKeyword].methods) {
              obj[key] = inspect(methodsCache[key], cache, true);
          }
  
          // Properties
          for (key in target[redefinedCacheKeyword].properties) {
              tmp = hasOwn(propertiesCache, key) ? propertiesCache[key] : target[key];
              obj[key] = inspect(tmp, cache, true);
          }
  
          // Handle undeclared properties
          methodsCache = def.methods;
          propertiesCache = def.properties;
          for (key in target) {
              if (hasOwn(target, key) && !hasOwn(obj, key) && !propertiesCache[key] && !methodsCache[key]) {
                  obj[key] = inspect(target[key], cache, true);
              }
          }
  
          // Fix the .constructor
          tmp = obj.constructor.$constructor;
          while (tmp) {
              inspectConstructor(tmp, cache, true);
              tmp = tmp.$parent;
          }
  
          return obj;
      }