code: @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);
      }
    }
docs: 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)