/**
   * Add a property change listener.
   *
   * @param l the listener to add
   */
  public synchronized void addPropertyChangeListener(PropertyChangeListener l) {
    if (support == null)
      synchronized (this) {
        // new test under synchronized block
        if (support == null) support = new PropertyChangeSupport(element);
      }

    support.addPropertyChangeListener(l);
  }
 /**
  * Remove a property change listener.
  *
  * @param l the listener to remove
  */
 public void removePropertyChangeListener(PropertyChangeListener l) {
   if (support != null) support.removePropertyChangeListener(l);
 }
 /**
  * Fires property change event.
  *
  * @param name property name
  * @param o old value
  * @param n new value
  */
 protected final void firePropertyChange(String name, Object o, Object n) {
   if (support != null) support.firePropertyChange(name, o, n);
 }