getDefinition(key, propList, functionContext = {}) {
    const defs = this.schema(key);
    if (!defs) return;

    const getPropIterator = (obj, newObj) => {
      return (prop) => {
        if (Array.isArray(propList) && !propList.includes(prop)) return;
        const val = obj[prop];
        // For any options that support specifying a function, evaluate the functions
        if (propsThatCanBeFunction.indexOf(prop) > -1 && typeof val === 'function') {
          newObj[prop] = val.call({
            key,
            ...functionContext,
          });
          // Inflect label if undefined
          if (prop === 'label' && typeof newObj[prop] !== 'string') newObj[prop] = inflectedLabel(key, this._constructorOptions.humanizeAutoLabels);
        } else {
          newObj[prop] = val;
        }
      };
    };

    const result = {};
    Object.keys(defs).forEach(getPropIterator(defs, result));

    // Resolve all the types and convert to a normal array to make it easier
    // to use.
    if (defs.type) {
      result.type = defs.type.definitions.map((typeDef) => {
        const newTypeDef = {};
        Object.keys(typeDef).forEach(getPropIterator(typeDef, newTypeDef));
        return newTypeDef;
      });
    }

    return result;
  }
Returns the evaluated definition for one key in the schema

@param {String} key Generic or specific schema key
@param {Array(String)} [propList] Array of schema properties you need; performance optimization
@param {Object} [functionContext] The context to use when evaluating schema options that are functions
@returns {Object} The schema definition for the requested key