public virtual IDisposable Subscribe(IObserver <T> observer)
        {
            var factory = new Lazy <PropertyChangedEventHandler>(() =>
            {
                PropertyChangedEventHandler handler = (s, e) =>
                {
                    if (e.PropertyName == PropertyName)
                    {
                        observer.OnNext(GetValue());
                    }
                };

                Source.PropertyChanged += handler;

                return(handler);
            });

            PropertyChangedEventHandler handler = Observers.GetOrAdd(observer, _ => factory.Value);

            return(Disposable.Create(() => Source.PropertyChanged -= handler));
        }