docs: function protectStaticProperty(name, meta, constructor) {
          constructor[cacheKeyword].properties[name] = meta.value;
  
          if (meta.isPrivate) {
              Object.defineProperty(constructor, name, {
                  get: function get() {
                      var currCaller = process._dejavu.caller;
  
                      if (currCaller && (currCaller.method[$name] || currCaller.method[$anonymous]) && meta.allowed === currCaller.constructorId) {
                          return constructor[cacheKeyword].properties[name];
                      }
  
                      throw new Error('Cannot access private static property "' + name + '" of class "' + constructor.prototype.$name + '".');
                  },
                  set: meta.isConst ?
                          function () {
                              throw new Error('Cannot change value of constant property "' + name + '" of class "' + constructor.prototype.$name + '".');
                          } :
                          function set(newVal) {
                              var currCaller = process._dejavu.caller;
  
                              if (currCaller && (currCaller.method[$name] || currCaller.method[$anonymous]) && meta.allowed === currCaller.constructorId) {
                                  constructor[cacheKeyword].properties[name] = newVal;
                              } else {
                                  throw new Error('Cannot set private property "' + name + '" of class "' + constructor.prototype.$name + '".');
                              }
                          },
                  configurable: false,
                  enumerable: true
              });
          } else if (meta.isProtected) {
              Object.defineProperty(constructor, name, {
                  get: function get() {
                      var currCaller = process._dejavu.caller;
  
                      if (currCaller && (currCaller.method[$name] || currCaller.method[$anonymous]) && (contains(meta.allowed, currCaller.constructorId) || constructor.prototype instanceof currCaller.constructor)) {
                          return constructor[cacheKeyword].properties[name];
                      }
  
                      throw new Error('Cannot access protected static property "' + name + '" of class "' + constructor.prototype.$name + '".');
                  },
                  set: meta.isConst ?
                          function () {
                              throw new Error('Cannot change value of constant property "' + name + '" of class "' + constructor.prototype.$name + '".');
                          } :
                          function set(newVal) {
                              var currCaller = process._dejavu.caller;
  
                              if (currCaller && (currCaller.method[$name] || currCaller.method[$anonymous]) && (contains(meta.allowed, currCaller.constructorId) || constructor.prototype instanceof currCaller.constructor)) {
                                  constructor[cacheKeyword].properties[name] = newVal;
                              } else {
                                  throw new Error('Cannot set protected static property "' + name + '" of class "' + constructor.prototype.$name + '".');
                              }
                          },
                  configurable: false,
                  enumerable: true
              });
          } else if (meta.isConst) {
              Object.defineProperty(constructor, name, {
                  get: function () {
                      return constructor[cacheKeyword].properties[name];
                  },
                  set: function () {
                      throw new Error('Cannot change value of constant property "' + name + '" of class "' + constructor.prototype.$name + '".');
                  },
                  configurable: false,
                  enumerable: true
              });
          }
      }