public KNKVOKeyPathObserver(Object aBaseObject, String aKeyPath, KNKVOObserver anObserver, KNKeyValueObservingOptions someOptions, Object aContext)
        {
            changes = new Stack<KNKVOObservationChangeTracker>();
            previousObservations = new ArrayList();
            baseObjectRef = new WeakReference(aBaseObject);
            keyPath = aKeyPath;
            context = aContext;
            options = someOptions;
            observer = anObserver;

            //this.ObserveValueForKeyPathOfObject(aKeyPath, observedObject, null, context);

            ResetObservationTree();

            if ((options & KNKeyValueObservingOptions.KNKeyValueObservingOptionInitial) == KNKeyValueObservingOptions.KNKeyValueObservingOptionInitial) {
                Dictionary<String, Object> change = new Dictionary<String, Object>();

                if ((options & KNKeyValueObservingOptions.KNKeyValueObservingOptionNew) == KNKeyValueObservingOptions.KNKeyValueObservingOptionNew) {
                    change.SetValueForKey(observedObject.ValueForKeyPath(keyPath), KNKVOConstants.KNKeyValueChangeNewKey);
                }

                observer.ObserveValueForKeyPathOfObject(keyPath, observedObject, change, context);
            }
        }