/// <summary>
        /// Binds the specified <see cref="PropertyChangedEventHandler"/> on _all_ observables (including via <see cref="INotifyCollectionChanged"/>)
        /// reachable via reflection that have a property with the specified name and type, and invokes the handler on those event that match the predicate.
        /// </summary>
        public static IDisposable BindRecursively <TPropertyType>(this INotifyPropertyChanged root,
                                                                  string propertyName,
                                                                  PropertyMutatedEventHandler <TPropertyType> handler)
        {
            return(root.BindRecursively(predicate, handlerWrapper));

            bool predicate(object obj, IPropertyMutatedEventArgs e)
            {
                if (e.PropertyName == propertyName)
                {
                    var propertyType = GetPropertyType(obj.GetType(), propertyName);
                    var result       = typeof(TPropertyType).IsAssignableFrom(propertyType);
                    return(result);
                }
                return(false);
            }

            void handlerWrapper(object sender, IPropertyMutatedEventArgs e)
            {
                handler(sender, (PropertyMutatedEventArgs <TPropertyType>)e);
            }
        }