/**
  * This method creates the object change set if necessary. It also creates/updates the change
  * record based on the new value. Object should check the if newValue and oldValue are identical.
  * If they are identical, do not create PropertyChangeEvent and call this method.
  */
 public void internalPropertyChange(PropertyChangeEvent evt) {
   super.internalPropertyChange(evt);
   // Also need to raise the event in the parent, to create a change set for it.
   // Only raise the event in parent if something actually changed.
   if (this.objectChangeSet != null && this.parentListener != null) {
     if (evt.getSource() == owner) {
       this.parentListener.internalPropertyChange(
           new PropertyChangeEvent(
               evt.getSource(), parentAttributeName, evt.getOldValue(), evt.getNewValue()));
     } else {
       // the event's source is not the owner of this change tracking policy - this is a nested
       // aggregate change.
       this.parentListener.internalPropertyChange(
           new PropertyChangeEvent(
               owner, parentAttributeName, evt.getOldValue(), evt.getNewValue()));
     }
   }
 }