public void propertyChanged(ConfigProperty prop) {
   for (PropertyListener l : listener) {
     if (l.listensTo(prop)) {
       l.propertyChanged(prop);
     }
   }
 }
  /**
   * {@inheritDoc}
   *
   * @see ConfigurationListener#configurationChanged(ConfigurationEvent)
   */
  @SuppressWarnings("unchecked")
  @Override
  public void configurationChanged(final ConfigurationEvent event) {

    if (pauseListener) {
      return;
    }

    // Grab the event information. Some values may be null.
    final Object source = event.getSource();
    final String name = event.getPropertyName();
    final Object value = event.getPropertyValue();
    final boolean beforeUpdate = event.isBeforeUpdate();

    // Handle the different types.
    switch (event.getType()) {

        // Key identifies node where the Collection of nodes was added, or
        // null if it was at the root.
      case HierarchicalConfiguration.EVENT_ADD_NODES:
      case ConcurrentCompositeConfiguration.EVENT_CONFIGURATION_SOURCE_CHANGED:
        expandedListener.configSourceLoaded(source);
        break;

        // Key identifies the individual property that was added.
      case AbstractConfiguration.EVENT_ADD_PROPERTY:
        expandedListener.addProperty(source, name, value, beforeUpdate);
        break;

        // Entire configuration was cleared.
      case AbstractConfiguration.EVENT_CLEAR:
        expandedListener.clear(source, beforeUpdate);
        break;

        // Key identifies the single property that was cleared.
      case AbstractConfiguration.EVENT_CLEAR_PROPERTY:
        expandedListener.clearProperty(source, name, value, beforeUpdate);
        break;

        // Key identifies the nodes that were removed, along with all its
        // children. Value after update is the List of nodes that were
        // cleared. Before the update, the value is null.
      case HierarchicalConfiguration.EVENT_CLEAR_TREE:
        // Ignore this. We rewrote the clearTree() method below.
        break;

        // The current property set is invalid.
      case CombinedConfiguration.EVENT_COMBINED_INVALIDATE:
        // listener.configSourceLoaded(source);
        break;

        // Key identifies the property that was read.
      case AbstractConfiguration.EVENT_READ_PROPERTY:
        break;

        // Key identifies the property that was set.
      case AbstractConfiguration.EVENT_SET_PROPERTY:
        expandedListener.setProperty(source, name, value, beforeUpdate);
        break;

      default:
        break;
    }
  }
 /**
  * {@inheritDoc}
  *
  * @see Object#hashCode()
  */
 @Override
 public int hashCode() {
   return expandedListener.hashCode();
 }