@SuppressWarnings("unchecked")
    public void firePropertyChange(T oldValue, T newValue) {
        List<java.beans.PropertyChangeListener> targets;
        synchronized (this) {
            if (this.listeners == null) {
                return;
            }
            targets = (List<java.beans.PropertyChangeListener>) listeners.clone();
        }
        // how should we get prop name
        PropertyChangeEvent<T> evt = new PropertyChangeEvent<T>(getSource(), null, oldValue, newValue);

        for (int i = 0; i < targets.size(); i++) {
            java.beans.PropertyChangeListener target = (java.beans.PropertyChangeListener) targets.get(i);
            try {
                if (target instanceof PropertyChangeListener<?>) {
                    PropertyChangeListener<T> localTarget = (PropertyChangeListener<T>) target;
                    localTarget.propertyChange(evt);
                } else {
                    target.propertyChange(evt);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // super?
        // super.firePropertyChange();
    }