docs: function decorate(metaProperty, target, key, descriptor) {
    var Class = typeof target === 'function' ? target : target.constructor;
    var proto = typeof target === 'function' ? target.prototype : target;
    var isClass = Class === target;
    var fn = descriptor.value;
  
    if (!Class instanceof _GQLBase.GQLBase) {
      console.warn((0, _neTagFns.dedent)(_templateObject(), fn && fn.name || key, Class.name));
      return descriptor;
    }
  
    if (!descriptor.value || descriptor.get || descriptor.set || descriptor.initializer) {
      console.warn((0, _neTagFns.dedent)(_templateObject2(), fn && fn.name || key));
      return descriptor;
    } // Remove the function from wherever it happens to be defined.
  
  
    delete target[key];
    delete descriptor.value;
  
    if (isClass) {
      delete proto[key];
    } else {
      delete Class[key];
    } // Obtain a reference to the metadata storage area and create the resolver
    // portion if it does not yet exist.
  
  
    Class[_GQLBase.META_KEY][metaProperty] = Class[_GQLBase.META_KEY][metaProperty] || []; // Ensure that the function name matches the key, if not, wrap it
    // such that future uses of the .name property match the key of the
    // decorated function
  
    if (fn.name !== key) {
      Object.defineProperty(fn, 'name', {
        get: function get() {
          return key;
        }
      });
    } // Store the key by name, overwritting if necessary, and assign the function
  
  
    Class[_GQLBase.META_KEY][metaProperty].push(fn); // Pass the decorated function along for others to consume
  
  
    descriptor[Symbol.for(metaProperty)] = fn; // Return a new decorator descriptor without the value function
  
    return descriptor;
  }