public ICFamilyRulesConfig GetEffectiveRulesConfig(string languageKey, ICFamilyRulesConfig defaultRulesConfig, UserSettings userSettings)
        {
            if (defaultRulesConfig == null)
            {
                throw new ArgumentNullException(nameof(defaultRulesConfig));
            }

            // Optimisation - if there are no user-specified rules settings then just return the default
            if ((userSettings?.Rules?.Count ?? 0) == 0)
            {
                logger.WriteLine(CoreStrings.EffectiveRules_NoUserSettings);
                return(defaultRulesConfig);
            }

            var effectiveConfig = configCache.FindConfig(languageKey, defaultRulesConfig, userSettings);

            if (effectiveConfig != null)
            {
                logger.WriteLine(CoreStrings.EffectiveRules_CacheHit);
            }
            else
            {
                logger.WriteLine(CoreStrings.EffectiveRules_CacheMiss);
                effectiveConfig = new DynamicCFamilyRulesConfig(defaultRulesConfig, userSettings);
                configCache.Add(languageKey, defaultRulesConfig, userSettings, effectiveConfig);
            }

            return(effectiveConfig);
        }
        public ICFamilyRulesConfig GetEffectiveRulesConfig(string languageKey, ICFamilyRulesConfig defaultRulesConfig, RulesSettings customSettings)
        {
            if (languageKey == null)
            {
                throw new ArgumentNullException(nameof(languageKey));
            }
            if (defaultRulesConfig == null)
            {
                throw new ArgumentNullException(nameof(defaultRulesConfig));
            }
            if (customSettings == null)
            {
                throw new ArgumentNullException(nameof(customSettings));
            }

            var effectiveConfig = configCache.FindConfig(languageKey, defaultRulesConfig, customSettings);

            if (effectiveConfig != null)
            {
                logger.WriteLine(CoreStrings.EffectiveRules_CacheHit);
                return(effectiveConfig);
            }

            logger.WriteLine(CoreStrings.EffectiveRules_CacheMiss);

            effectiveConfig = new DynamicCFamilyRulesConfig(defaultRulesConfig, customSettings, logger);

            configCache.Add(languageKey, defaultRulesConfig, customSettings, effectiveConfig);

            return(effectiveConfig);
        }