public void enter(Object value) {
    Object[] values = (Object[]) value;
    if (!checkPass(values)) {
      return;
    }

    // if value not already encountered, enter into aggregate
    if (valueSet.add(values[0])) {
      inner.enter(value);
    }
  }
  public void leave(Object value) {
    Object[] values = (Object[]) value;
    if (!checkPass(values)) {
      return;
    }

    // if last reference to the value is removed, remove from aggregate
    if (valueSet.remove(values[0])) {
      inner.leave(value);
    }
  }
 public Class getValueType() {
   return inner.getValueType();
 }
 public Object getValue() {
   return inner.getValue();
 }
 public void clear() {
   valueSet.clear();
   inner.clear();
 }