001package co.codewizards.cloudstore.core.bean;
002
003import java.beans.PropertyChangeListener;
004
005public abstract class AbstractBean<P extends PropertyBase> implements CloneableBean<P>, Cloneable {
006        private BeanSupport<AbstractBean<P>, P> beanSupport = new BeanSupport<AbstractBean<P>, P>(this);
007
008        protected void setPropertyValue(P property, Object value) {
009                beanSupport.setPropertyValue(property, value);
010        }
011
012        protected <V> V getPropertyValue(P property) {
013                return beanSupport.getPropertyValue(property);
014        }
015
016        @Override
017        public void addPropertyChangeListener(PropertyChangeListener listener) {
018                beanSupport.addPropertyChangeListener(listener);
019        }
020
021        @Override
022        public void removePropertyChangeListener(PropertyChangeListener listener) {
023                beanSupport.removePropertyChangeListener(listener);
024        }
025
026        @Override
027        public void addPropertyChangeListener(P property, PropertyChangeListener listener) {
028                beanSupport.addPropertyChangeListener(property, listener);
029        }
030
031        @Override
032        public void removePropertyChangeListener(P property, PropertyChangeListener listener) {
033                beanSupport.removePropertyChangeListener(property, listener);
034        }
035
036        protected void firePropertyChange(final P property, Object oldValue, Object newValue) {
037                beanSupport.firePropertyChange(property, oldValue, newValue);
038        }
039
040        @Override
041        public Object clone() { // returning Object to allow sub-classes to declare returning an interface or whatever they want (and fits)
042                final AbstractBean<P> clone;
043                try {
044                        @SuppressWarnings("unchecked")
045                        final AbstractBean<P> c = (AbstractBean<P>) super.clone();
046                        clone = c;
047                } catch (CloneNotSupportedException e) {
048                        throw new RuntimeException(e);
049                }
050                clone.beanSupport = new BeanSupport<AbstractBean<P>, P>(clone);
051                return clone;
052        }
053}