package co.codewizards.cloudstore.core.bean;
import java.beans.PropertyChangeListener;
public abstract class AbstractBean<P extends PropertyBase> implements CloneableBean<P>, Cloneable {
private BeanSupport<AbstractBean<P>, P> beanSupport = new BeanSupport<AbstractBean<P>, P>(this);
protected void setPropertyValue(P property, Object value) {
beanSupport.setPropertyValue(property, value);
}
protected <V> V getPropertyValue(P property) {
return beanSupport.getPropertyValue(property);
}
@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {
beanSupport.addPropertyChangeListener(listener);
}
@Override
public void removePropertyChangeListener(PropertyChangeListener listener) {
beanSupport.removePropertyChangeListener(listener);
}
@Override
public void addPropertyChangeListener(P property, PropertyChangeListener listener) {
beanSupport.addPropertyChangeListener(property, listener);
}
@Override
public void removePropertyChangeListener(P property, PropertyChangeListener listener) {
beanSupport.removePropertyChangeListener(property, listener);
}
protected void firePropertyChange(final P property, Object oldValue, Object newValue) {
beanSupport.firePropertyChange(property, oldValue, newValue);
}
@Override
public Object clone() { // returning Object to allow sub-classes to declare returning an interface or whatever they want (and fits)
final AbstractBean<P> clone;
try {
@SuppressWarnings("unchecked")
final AbstractBean<P> c = (AbstractBean<P>) super.clone();
clone = c;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
clone.beanSupport = new BeanSupport<AbstractBean<P>, P>(clone);
return clone;
}
}