function wrapMethodsByWordEnding(componentArray, wordEnding, keyReplaceString = '') {
  return componentArray.reduce((previous, current) => {
    let newObject = {};

    for(var key in current) {
      const keyWithoutEnhancer = key.replace(wordEnding, keyReplaceString);

      if(key.endsWith(wordEnding) && (previous.hasOwnProperty(keyWithoutEnhancer) || current.hasOwnProperty(keyWithoutEnhancer))) {
        // Determine if we are working with an HoC that wraps another HoC
        newObject[keyWithoutEnhancer] = keyWithoutEnhancer.endsWith('Container') || keyWithoutEnhancer.endsWith('Enhancer') ?
          // If we are enhancing a container or enhancer flow this stuff since it's likely an HoC
          flowRight(current[key], (current[keyWithoutEnhancer] || previous[keyWithoutEnhancer])) :
          // Wrap the current component in the Enhancer or container
          current[key](current[keyWithoutEnhancer] || previous[keyWithoutEnhancer])
      }
    }

    return pickBy(Object.assign(previous, current, newObject), (v, k) => (!k.endsWith(wordEnding))) ;
  }, {})
}
Wraps all methods in another method by name and word ending
@param {array<Object>} componentObjectArray - An array of component objects
@param {string} ending - the word ending to determine what is a enhancer method
@param {string} keyReplaceString - the word ending to apply when replacing the 'ending' parameter. Defaults to ''