class AbstractProperty extends AbstractObservableValue<T> implements SettableValue<T> {

  @Override
  public final void set(@NotNull T value) {
    if (myConstraints != null) {
      for (Constraint<T> c : myConstraints) {
        value = c.constrain(value);
      }
    }
    if (!isValueEqual(value)) {
      setNotificationsEnabled(false);
      setDirectly(value);
      setNotificationsEnabled(true);
      notifyInvalidated();
    }
  }

}