function _adaptDeepChildObservation(caller, oControl, oAggregation, bObserve) {
		var aChildren = oAggregation.get(oControl) || [], oChild, bRecord;

		for (var i = 0; i < aChildren.length; i++) {
			oChild = aChildren[i];
			if (!(oChild instanceof ManagedObject)) {
				continue;
			}
			bRecord = true;

			if (bObserve) {
				caller._oObserver.observe(oChild, {
					properties: true,
					aggregations: true
				});
			} else {
				caller._oObserver.unobserve(oChild, {
					properties: true,
					aggregations: true
				});
			}

			var mAggregations = oChild.getMetadata().getAllAggregations();

			for (var sKey in mAggregations) {
				_adaptDeepChildObservation(caller, oChild, mAggregations[sKey], bObserve);
			}
		}

		if (bRecord) {
			var sKey = oControl.getId() + "/@" + oAggregation.name;

			if (bObserve) {
				if (!caller._mObservedCount.aggregations[sKey]) {
					caller._mObservedCount.aggregations[sKey] = 0;
				}
				caller._mObservedCount.aggregations[sKey]++;
			} else {
				delete caller._mObservedCount.aggregations[sKey];
			}
		}
	}
function _adaptDeepChildObservation(caller, oControl, oAggregation, bObserve) {
		var aChildren = oAggregation.get(oControl) || [], oChild, bRecord;

		for (var i = 0; i < aChildren.length; i++) {
			oChild = aChildren[i];
			if (!(oChild instanceof ManagedObject)) {
				continue;
			}
			bRecord = true;

			if (bObserve) {
				caller._oObserver.observe(oChild, {
					properties: true,
					aggregations: true
				});
			} else {
				caller._oObserver.unobserve(oChild, {
					properties: true,
					aggregations: true
				});
			}

			var mAggregations = oChild.getMetadata().getAllAggregations();

			for (var sKey in mAggregations) {
				_adaptDeepChildObservation(caller, oChild, mAggregations[sKey], bObserve);
			}
		}

		if (bRecord) {
			var sKey = oControl.getId() + "/@" + oAggregation.name;

			if (bObserve) {
				if (!caller._mObservedCount.aggregations[sKey]) {
					caller._mObservedCount.aggregations[sKey] = 0;
				}
				caller._mObservedCount.aggregations[sKey]++;
			} else {
				delete caller._mObservedCount.aggregations[sKey];
			}
		}
	}
function _adaptDeepChildObservation ( caller , oControl , oAggregation , bObserve ) { var aChildren = oAggregation . get ( oControl ) || [ ] , oChild , bRecord ; for ( var i = 0 ; i < aChildren . length ; i ++ ) { oChild = aChildren [ i ] ; if ( ! ( oChild instanceof ManagedObject ) ) { continue ; } bRecord = true ; if ( bObserve ) { caller . _oObserver . observe ( oChild , { properties : true , aggregations : true } ) ; } else { caller . _oObserver . unobserve ( oChild , { properties : true , aggregations : true } ) ; } var mAggregations = oChild . getMetadata ( ) . getAllAggregations ( ) ; for ( var sKey in mAggregations ) { _adaptDeepChildObservation ( caller , oChild , mAggregations [ sKey ] , bObserve ) ; } } if ( bRecord ) { var sKey = oControl . getId ( ) + "/@" + oAggregation . name ; if ( bObserve ) { if ( ! caller . _mObservedCount . aggregations [ sKey ] ) { caller . _mObservedCount . aggregations [ sKey ] = 0 ; } caller . _mObservedCount . aggregations [ sKey ] ++ ; } else { delete caller . _mObservedCount . aggregations [ sKey ] ; } } }
Adapt the observation of child controls in order to be able to react when e.g. the value
of a select inside a list changed. Currently the MOM is not updated then

@param {object} the caller, here the managed object model
@param {control} the control which shall be (un)observed
@param {object} the observed aggregation
@param {boolean} <code>true</code> for observing and <code>false</code> for unobserving

@private
Adapt the observation of child controls in order to be able to react when e . g . the value of a select inside a list changed . Currently the MOM is not updated then
Adaptes the observers of a deep child aggregation.