@SuppressWarnings("unchecked")
  protected void processChange(String propertyName, Object oldValue, Object newValue, StateChangeCallback callback) {
    try {
      PropertyChangeEvent event = newPropertyChangeEvent(propertyName, oldValue, newValue);

      fireVetoableChange(event);

      if (callback != null) {
        callback.changeState();
      }
      else if (propertyNameToParameterizedStateChangeCallbackMapping.containsKey(propertyName)) {
        propertyNameToParameterizedStateChangeCallbackMapping.get(propertyName).changeState(newValue);
      }
      else {
        changeState(propertyName, newValue);
      }

      firePropertyChange(event);
      fireChange();
    }
    catch (PropertyVetoException e) {
      throw new IllegalPropertyValueException(String.format(
        "The new value (%1$s) for property (%2$s) on Bean (%3$s) is not valid!",
          newValue, propertyName, getClass().getName()), e);
    }
  }
@ SuppressWarnings ( "unchecked" ) protected void processChange ( String propertyName , Object oldValue , Object newValue , StateChangeCallback callback ) { try { PropertyChangeEvent event = newPropertyChangeEvent ( propertyName , oldValue , newValue ) ; fireVetoableChange ( event ) ; if ( callback != null ) { callback . changeState ( ) ; } else if ( propertyNameToParameterizedStateChangeCallbackMapping . containsKey ( propertyName ) ) { propertyNameToParameterizedStateChangeCallbackMapping . get ( propertyName ) . changeState ( newValue ) ; } else { changeState ( propertyName , newValue ) ; } firePropertyChange ( event ) ; fireChange ( ) ; } catch ( PropertyVetoException e ) { throw new IllegalPropertyValueException ( String . format ( "The new value (%1$s) for property (%2$s) on Bean (%3$s) is not valid!" , newValue , propertyName , getClass ( ) . getName ( ) ) , e ) ; } }
Processes the change in state to the particular property of this Bean.  A PropertyChangeEvent is created
to notify all listeners of the state change.  First, VetoableChangeListeners are notified of the pending change
in order to validate the change and veto any undesired change to the specified property.  Next, the state change
is effected followed by notification of all PropertyChangeListeners.  Finally, a change event is sent to all
ChangeListeners notifying them this Bean has been changed.

This particular implementation employs a callback style approach to effectively changing the state of this Bean.
As it is not always possible to access the particular fields of an object's class, the callback allows the subclass
to effect the change.

@param propertyName a String value specifying the name of the property on this Bean that is being changed.
@param oldValue an Object containing the old value of the specified property.
@param newValue an Object containing the new value for the specified property.
@param callback the StateChangeCallback implementation used to actually effect the state transition on the
specified property of this Bean.
@throws IllegalPropertyValueException if the property change violates a constraint imposed by one of the
VetoableChangeListeners listening to property change events on this Bean.
@see #processChange(String, Object, Object)