public static void keepNamedPropertyChangeListener(Object bean,
            String beanPropertyName, final String propertyPropertyName,
            final PropertyChangeListener propertyChangeListener) {
        Object beanProperty = getProperty(bean, beanPropertyName);
        if (beanProperty != null) {
            addNamedPropertyChangeListener(
                    beanProperty, propertyPropertyName, propertyChangeListener);
        }
        addNamedPropertyChangeListener(
                bean, beanPropertyName, new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                Object oldValue = evt.getOldValue();
                if (oldValue != null) {
                    removeNamedPropertyChangeListener(
                            oldValue, propertyPropertyName, propertyChangeListener);
                }
                Object newValue = evt.getNewValue();
                if (newValue != null) {
                    addNamedPropertyChangeListener(
                            newValue, propertyPropertyName, propertyChangeListener);
                }
            }
        });
    }