code: public synchronized Object setProperty(
          final String key,
          final String value)
      {
          String oldValue = super.getProperty(key);
          Object object = super.setProperty(key, value);
          if ((oldValue == null) && (object != null)) {
              oldValue = object.toString();
          }
  
          // If there is a property object, notify it to give it chane to fire
          // its triggers. If one of those triggers fires a veto exception, roll
          // back the change.
          Property property = (Property) properties.get(key);
          if ((property != null)
              && triggersAreEnabled())
          {
              try {
                  property.onChange(oldValue, value);
              } catch (Trigger.VetoRT vex) {
                  // Reset to the old value, do not call setProperty
                  // unless you want to run out of stack space!
                  superSetProperty(key, oldValue);
                  try {
                      property.onChange(value, oldValue);
                  } catch (Trigger.VetoRT ex) {
                      // ignore during reset
                  }
  
                  // Re-throw.
                  throw vex;
              }
          }
          return oldValue;
      }
docs: Sets the value of a property.
  
  <p>If the previous value does not equal the new value, executes any
  {@link Trigger}s associated with the property, in order of their {@link
  Trigger#phase() phase}.
  
  @param key Name of property
  @param value Value
  
  @return the old value