public CompositePathGetter
        (
            IEnumerable <IBindingPathLink <object> > pathLinks,
            PropertyType defaultValue
        )
        {
            _pathLinks = pathLinks;

            _defaultValue = defaultValue;

            if (pathLinks.IsNullOrEmpty())
            {
                PropGetters.Add(new SimplePropGetter <object>());
                return;
            }

            IObjWithPropGetter <object> previousPropGetter = null;

            foreach (var pathLink in _pathLinks)
            {
                IObjWithPropGetter <object> propGetter = pathLink.CreateGetter();

                PropGetters.Add(propGetter);

                if (previousPropGetter != null)
                {
                    IObjWithPropGetter <object> thePreviousPropGetter = previousPropGetter;
                    previousPropGetter.PropertyChangedEvent += () =>
                    {
                        propGetter.TheObj = thePreviousPropGetter.GetPropValue();
                    };
                }

                previousPropGetter = propGetter;
            }

            previousPropGetter.PropertyChangedEvent += () =>
            {
                if (this.PropertyChangedEvent == null)
                {
                    return;
                }

                if (!LastPropGetter.HasObj)
                {
                    _cachedValue.TheValue = _defaultValue;
                }
                else
                {
                    _cachedValue.TheValue = (PropertyType)LastPropGetter.GetPropValue();
                }

                PropertyChangedEvent?.Invoke();
            };
        }
        public CompositePathSetter(IEnumerable <IBindingPathLink <object> > pathLinks)
        {
            IBindingPathLink <object> theSetterPathLink = pathLinks.Last();

            TheSetter = theSetterPathLink.CreateSetter();

            PropGetters =
                pathLinks
                .TakeWhile((pathLink) => (!Object.ReferenceEquals(pathLink, theSetterPathLink)))
                .Select((pathLink) => pathLink.CreateGetter())
                .ToList();

            IObjWithPropGetter <object> previousPropGetter = null;

            foreach (var propGetter in PropGetters)
            {
                IObjWithPropGetter <object> thePreviousPropGetter = previousPropGetter;
                if (previousPropGetter != null)
                {
                    thePreviousPropGetter.PropertyChangedEvent += () =>
                    {
                        propGetter.TheObj = thePreviousPropGetter.GetPropValue();
                    };
                }

                previousPropGetter = propGetter;
            }

            if (previousPropGetter != null)
            {
                IObjWithPropGetter <object> thePreviousPropGetter = previousPropGetter;
                // set the last property getter to the set the setter
                previousPropGetter.PropertyChangedEvent += () =>
                {
                    TheSetter.TheObj = thePreviousPropGetter.GetPropValue();
                };
            }
        }