function (mChangeListeners, sPath, oOldObject, oNewObject) {
			if (!oNewObject) {
				return;
			}

			// iterate over all properties in the old object
			Object.keys(oOldObject).forEach(function (sProperty) {
				var sPropertyPath = _Helper.buildPath(sPath, sProperty),
					vOldProperty = oOldObject[sProperty],
					vNewProperty;

				if (sProperty in oNewObject || sProperty[0] === "#") {
					// the property was patched
					vNewProperty = oNewObject[sProperty];
					if (vNewProperty && typeof vNewProperty === "object") {
						if (Array.isArray(vNewProperty)) {
							// copy complete collection; no change events as long as
							// collection-valued properties are not supported
							oOldObject[sProperty] = vNewProperty;
						} else if (vOldProperty) {
							// a structural property in cache and patch -> recursion
							_Helper.updateExisting(mChangeListeners, sPropertyPath, vOldProperty,
								vNewProperty);
						} else {
							// a structural property was added
							oOldObject[sProperty] = vNewProperty;
							_Helper.fireChanges(mChangeListeners, sPropertyPath, vNewProperty,
								false);
						}
					} else if (vOldProperty && typeof vOldProperty === "object") {
						// a structural property was removed
						oOldObject[sProperty] = vNewProperty;
						_Helper.fireChanges(mChangeListeners, sPropertyPath, vOldProperty, true);
					} else {
						// a primitive property
						oOldObject[sProperty] = vNewProperty;
						if (vOldProperty !== vNewProperty) {
							_Helper.fireChange(mChangeListeners, sPropertyPath, vNewProperty);
						}
					}
				}
			});

			// iterate over all new advertised actions
			Object.keys(oNewObject).filter(function (sProperty) {
				return sProperty[0] === "#";
			}).filter(function (sAdvertisedAction) {
				return !(sAdvertisedAction in oOldObject);
			}).forEach(function (sNewAdvertisedAction) {
				var vNewProperty = oNewObject[sNewAdvertisedAction],
					sPropertyPath = _Helper.buildPath(sPath, sNewAdvertisedAction);

				// a structural property was added
				oOldObject[sNewAdvertisedAction] = vNewProperty;
				_Helper.fireChanges(mChangeListeners, sPropertyPath, vNewProperty, false);
			});
		}
function (mChangeListeners, sPath, oOldObject, oNewObject) {
			if (!oNewObject) {
				return;
			}

			// iterate over all properties in the old object
			Object.keys(oOldObject).forEach(function (sProperty) {
				var sPropertyPath = _Helper.buildPath(sPath, sProperty),
					vOldProperty = oOldObject[sProperty],
					vNewProperty;

				if (sProperty in oNewObject || sProperty[0] === "#") {
					// the property was patched
					vNewProperty = oNewObject[sProperty];
					if (vNewProperty && typeof vNewProperty === "object") {
						if (Array.isArray(vNewProperty)) {
							// copy complete collection; no change events as long as
							// collection-valued properties are not supported
							oOldObject[sProperty] = vNewProperty;
						} else if (vOldProperty) {
							// a structural property in cache and patch -> recursion
							_Helper.updateExisting(mChangeListeners, sPropertyPath, vOldProperty,
								vNewProperty);
						} else {
							// a structural property was added
							oOldObject[sProperty] = vNewProperty;
							_Helper.fireChanges(mChangeListeners, sPropertyPath, vNewProperty,
								false);
						}
					} else if (vOldProperty && typeof vOldProperty === "object") {
						// a structural property was removed
						oOldObject[sProperty] = vNewProperty;
						_Helper.fireChanges(mChangeListeners, sPropertyPath, vOldProperty, true);
					} else {
						// a primitive property
						oOldObject[sProperty] = vNewProperty;
						if (vOldProperty !== vNewProperty) {
							_Helper.fireChange(mChangeListeners, sPropertyPath, vNewProperty);
						}
					}
				}
			});

			// iterate over all new advertised actions
			Object.keys(oNewObject).filter(function (sProperty) {
				return sProperty[0] === "#";
			}).filter(function (sAdvertisedAction) {
				return !(sAdvertisedAction in oOldObject);
			}).forEach(function (sNewAdvertisedAction) {
				var vNewProperty = oNewObject[sNewAdvertisedAction],
					sPropertyPath = _Helper.buildPath(sPath, sNewAdvertisedAction);

				// a structural property was added
				oOldObject[sNewAdvertisedAction] = vNewProperty;
				_Helper.fireChanges(mChangeListeners, sPropertyPath, vNewProperty, false);
			});
		}
function ( mChangeListeners , sPath , oOldObject , oNewObject ) { if ( ! oNewObject ) { return ; } // iterate over all properties in the old object Object . keys ( oOldObject ) . forEach ( function ( sProperty ) { var sPropertyPath = _Helper . buildPath ( sPath , sProperty ) , vOldProperty = oOldObject [ sProperty ] , vNewProperty ; if ( sProperty in oNewObject || sProperty [ 0 ] === "#" ) { // the property was patched vNewProperty = oNewObject [ sProperty ] ; if ( vNewProperty && typeof vNewProperty === "object" ) { if ( Array . isArray ( vNewProperty ) ) { // copy complete collection; no change events as long as // collection-valued properties are not supported oOldObject [ sProperty ] = vNewProperty ; } else if ( vOldProperty ) { // a structural property in cache and patch -> recursion _Helper . updateExisting ( mChangeListeners , sPropertyPath , vOldProperty , vNewProperty ) ; } else { // a structural property was added oOldObject [ sProperty ] = vNewProperty ; _Helper . fireChanges ( mChangeListeners , sPropertyPath , vNewProperty , false ) ; } } else if ( vOldProperty && typeof vOldProperty === "object" ) { // a structural property was removed oOldObject [ sProperty ] = vNewProperty ; _Helper . fireChanges ( mChangeListeners , sPropertyPath , vOldProperty , true ) ; } else { // a primitive property oOldObject [ sProperty ] = vNewProperty ; if ( vOldProperty !== vNewProperty ) { _Helper . fireChange ( mChangeListeners , sPropertyPath , vNewProperty ) ; } } } } ) ; // iterate over all new advertised actions Object . keys ( oNewObject ) . filter ( function ( sProperty ) { return sProperty [ 0 ] === "#" ; } ) . filter ( function ( sAdvertisedAction ) { return ! ( sAdvertisedAction in oOldObject ) ; } ) . forEach ( function ( sNewAdvertisedAction ) { var vNewProperty = oNewObject [ sNewAdvertisedAction ] , sPropertyPath = _Helper . buildPath ( sPath , sNewAdvertisedAction ) ; // a structural property was added oOldObject [ sNewAdvertisedAction ] = vNewProperty ; _Helper . fireChanges ( mChangeListeners , sPropertyPath , vNewProperty , false ) ; } ) ; }
Updates the old object with the new object. Only existing properties of the old object
are updated. Fires change events for all changed properties. The function recursively
handles modified, added or removed structural properties and fires change events for all
modified/added/removed primitive properties therein. Collection-valued properties are
only updated in the old object, there are no change events for properties therein. Also
fires change events for new advertised actions.

@param {object} mChangeListeners A map of change listeners by path
@param {string} sPath The path of the old object in mChangeListeners
@param {object} oOldObject The old object
@param {object} [oNewObject] The new object
Updates the old object with the new object . Only existing properties of the old object are updated . Fires change events for all changed properties . The function recursively handles modified added or removed structural properties and fires change events for all modified / added / removed primitive properties therein . Collection - valued properties are only updated in the old object there are no change events for properties therein . Also fires change events for new advertised actions .
Updates the properties in the new object