@@ -0,0 +1,931 @@
+package to.etc.domui.util;%0A%0Aimport javax.annotation.*;%0A%0Aimport to.etc.domui.databinding.*;%0Aimport to.etc.webapp.annotations.*;%0A%0Apublic class ObservableObject implements IObservableEntity %7B%0A%09@Nullable%0A%09private ObserverSupport%3CObservableObject%3E m_osupport;%0A%0A%09@Nonnull%0A%09protected ObserverSupport%3CObservableObject%3E getObserverSupport() %7B%0A%09%09ObserverSupport%3CObservableObject%3E osupport = m_osupport;%0A%09%09if(null == osupport) %7B%0A%09%09%09osupport = m_osupport = new ObserverSupport%3CObservableObject%3E(this);%0A%09%09%7D%0A%09%09return osupport;%0A%09%7D%0A%0A%09protected %3CV%3E void firePropertyChange(@Nonnull String propertyName, V old, V nw) %7B%0A%09%09ObserverSupport%3C ? %3E osupport = m_osupport;%0A%09%09if(null == osupport)%09%09%09%09%09// Nothing observing?%0A%09%09%09return;%0A%09%09osupport.fireModified(propertyName, old, nw);%0A%09%7D%0A%0A%09@Override%0A%09@Nonnull%0A%09public IObservableValue%3C ? %3E observableProperty(@Nonnull @GProperty String property) %7B%0A%09%09return getObserverSupport().getValueObserver(property);%0A%09%7D%0A%7D%0A

Create generic observable base class which contains basic observer infra