protected void RegisterMapping(ResourceMappingChecker checker, ResourceMappingMapper mapper,
                                       ResourceMappingMode mappingMode, ResourceGameMode replacementGameMode = ResourceGameMode.All,
                                       string pathToWhitelist = null)
        {
            // turn off replacement if not supported by current mode
            if (!IsCurrentGameMode(replacementGameMode))
            {
                mappingMode &= ~ResourceMappingMode.Replacement;
            }

            if (mappingMode == ResourceMappingMode.None)
            {
                return;
            }
            var mapperId      = GetMapperId(mapper);
            var mapperEntries = _checkers.GetOrInit(checker);

            var entry = mapperEntries.FirstOrDefault(e => e.MapperId == mapperId);

            if (entry == null)
            {
                mapperEntries.Add(new MapperEntry(mapperId, mappingMode));
            }
            else
            {
                entry.Mode |= mappingMode;
            }

            if (_checkerModes.ContainsKey(checker))
            {
                _checkerModes[checker] |= mappingMode;
            }
            else
            {
                _checkerModes[checker] = mappingMode;
            }

            if (!pathToWhitelist.IsNullOrEmpty())
            {
                WhiteListPaths.Add(pathToWhitelist);
            }

            if (!HasReplacementMappingsForCurrentGameMode &&
                (mappingMode & ResourceMappingMode.Replacement) == ResourceMappingMode.Replacement &&
                (replacementGameMode & _currentModeFlag) == _currentModeFlag)
            {
                HasReplacementMappingsForCurrentGameMode = true;
            }

            ResetCaches();
        }
        private IEnumerable <ResourceMappingMapper> GetMappers(ResourceMappingChecker checker,
                                                               ResourceMappingMode mode)
        {
            if (!_checkers.TryGetValue(checker, out var mapperEntries))
            {
                yield break;
            }

            foreach (var id in mapperEntries.Where(e => (e.Mode & mode) == mode).Select(e => e.MapperId))
            {
                if (_mappers.TryGetValue(id, out var mapper))
                {
                    yield return(mapper);
                }
            }
        }