internal virtual void AddProvider <T, TArgs>(
            [NotNull] ICustomObservable <TArgs> provider,
            [NotNull] ObservableMap <T, TArgs> map)
            where TArgs : EventArgs
        {
            if (provider == null)
            {
                throw new ArgumentNullException(nameof(provider));
            }
            if (map == null)
            {
                throw new ArgumentNullException(nameof(map));
            }

            var providerType = provider.GetType();

            _notificationsCache.Add <TArgs>(providerType, (sender, args) =>
            {
                var unboxedArgs = (TArgs)args;
                if (map.TryGetHandler(unboxedArgs, out var handler))
                {
                    handler.Invoke(sender, unboxedArgs);
                }
            });
            void NotifierDelegate(object sender, TArgs args) => Provider_OnNotify(sender, args, providerType);

            provider.Notify += NotifierDelegate;
            _providerUnsubscriberCache.Add <TArgs>(providerType, () => provider.Notify -= NotifierDelegate);
        }