public static IDisposable BindPropertyToObject(
     INotifyPropertyChanged source, 
     string propertyName, 
     object target,
     Action<object, object> setTargetValue,
     Func<object, IObservable<object>> createTargetObservable,
     Func<object> getInitialValue,
     Func<object, object> getCurrentValue)
 {
     var propertyObs = source.ObservableForProperty(new string[] { propertyName });
     propertyObs.Subscribe(e => {
         setTargetValue(target, e.Value);
     });
     var targetObs = createTargetObservable(target);
     var propertySetter = source.GetType().GetProperty(propertyName).GetSetMethod();
     return Observable.Return(getInitialValue()).Concat(targetObs).Subscribe(e => {
         propertySetter.Invoke(source, new object[] { getCurrentValue(target) });
     });
 }