/**
 * Object.defineProperty mais "lazy", ce qui signifie que la valeur n'est définie qu'après que l'objet a été défini
 * il est récupéré la première fois, au lieu d'être fixé immédiatement.
 *
 * @param {Object} obj l'objet sur lequel la propriété doit être définie
 * @param {string} key la clé de la propriété à définir
 * @param {Function} getValue la fonction utilisée pour obtenir la valeur lorsqu'elle est nécessaire.
 * @param {boolean} setter si un setter doit être autorisé ou non
 */
const defineLazyProperty = function(obj, key, getValue, setter = true) {
  const set = (valeur) =>
    Object.defineProperty(obj, key, {value, enumerable : true, writable : true}) ;

  const options = {
    configurable : true,
    énumérable : vrai,
    get() {
      const value = getValue() ;

      set(valeur) ;

      valeur de retour ;
    }
  };

  if (setter) {
    options.set = set ;
  }

  return Object.defineProperty(obj, key, options) ;
};

export default defineLazyProperty ;