/// <summary>
        /// </summary>
        /// <param name="parentManager"></param>
        /// <param name="dependentPropertyName">Name of the depending property</param>
        public NotificationChain(NotificationChainManager parentManager, String dependentPropertyName)
        {
            parentManager.ThrowIfNull("parentManager");
            dependentPropertyName.ThrowIfNull("dependentPropertyName");

            ParentManager           = parentManager;
            DependentPropertyName   = dependentPropertyName;
            myFireCallbacksCallback = (sender, notifyingProperty, dependentProperty) => Execute(sender, notifyingProperty);
        }
        /// <summary>
        /// Creates a new NotificationChainManager for the given property, or returns an existing instance
        /// </summary>
        /// <typeparam name="T0"></typeparam>
        /// <typeparam name="T1"></typeparam>
        /// <param name="propGetter"></param>
        /// <returns></returns>
        internal NotificationChainManager CreateOrGetManager <T0, T1> (Expression <Func <T0, T1> > propGetter)
            where T0 : INotifyPropertyChanged
            where T1 : class
        {
            var propName = propGetter.GetPropertyOrFieldName();

            NotificationChainManager mgr;

            if (!myDeepChainManagers.TryGetValue(propName, out mgr))
            {
                mgr = myDeepChainManagers[propName] = new NotificationChainManager();
                myDeepChainGetters[propName] = parent => propGetter.Compile().Invoke((T0)parent);
            }

            return(mgr);
        }
        // TODO consolidate CreateOrGetDeepManager methods? Only diff is propGetter

        /// <summary>
        /// Creates a new NotificationChainManager for the given property, or returns an existing instance
        /// </summary>
        /// <typeparam name="T1"></typeparam>
        /// <param name="propGetter"></param>
        /// <returns></returns>
        internal NotificationChainManager CreateOrGetManager <T1> (Expression <Func <T1> > propGetter)
            where T1 : class
        {
            var propName = propGetter.GetPropertyOrFieldName();

            NotificationChainManager mgr;

            if (!myDeepChainManagers.TryGetValue(propName, out mgr))
            {
                myDeepChainManagers[propName] = mgr = new NotificationChainManager();
                myDeepChainGetters[propName]  = _ => propGetter.Compile().Invoke();
                var currentValue = (T1)myDeepChainGetters[propName] (null);
                if (currentValue != null)
                {
                    mgr.Observe(currentValue);
                }
            }

            return(mgr);
        }