lib/classes/Variables.js/Variables/overwrite
class Variables:  overwrite(variableStrings, variableMatch, propertyString) {
    // A sentinel to rid rejected Promises, so any of resolved value can be used as fallback.
    const FAIL_TOKEN = {};
    const variableValues = variableStrings.map(variableString =>
      this.getValueFromSource(variableString, propertyString)
        .catch(unused => FAIL_TOKEN)); // eslint-disable-line no-unused-vars

    const validValue = value => (
      value !== null &&
      typeof value !== 'undefined' &&
      !(typeof value === 'object' && _.isEmpty(value))
    );
    return BbPromise.all(variableValues)
      .then(values => values.filter(v => v !== FAIL_TOKEN))
      .then(values => {
        let deepPropertyString = variableMatch;
        let deepProperties = 0;
        values.forEach((value, index) => {
          if (_.isString(value) && value.match(this.variableSyntax)) {
            deepProperties += 1;
            const deepVariable = this.makeDeepVariable(value);
            deepPropertyString = deepPropertyString.replace(
              variableStrings[index],
              this.cleanVariable(deepVariable));
          }
        });
        return deepProperties > 0 ?
          BbPromise.resolve(deepPropertyString) : // return deep variable replacement of original
          BbPromise.resolve(values.find(validValue));// resolve first valid value, else undefined
      });
  }