private static <T> void updateValue(final T destParent,
                                        final Prop prop,
                                        final Object sourcePropValue,
                                        final Object destPropValue,
                                        final Object defaultPropValue,
                                        final UpdateAction updateAction,
                                        final CopyOption... copyOptions)
            throws IllegalAccessException, InvocationTargetException {
        if (sourcePropValue != null || !isOptionPresent(CopyOption.DONT_COPY_NULLS, copyOptions)) {
            // source not null OR are copying nulls

            boolean doCopy = false;

            if (isOptionPresent(CopyOption.DONT_COPY_DEFAULTS, copyOptions)) {
                if (Objects.equals(sourcePropValue, defaultPropValue)) {
                    LOGGER.trace("Source value of {} is a default value but we are not copying defaults",
                            sourcePropValue);
                } else {
                    doCopy = true;
                }
            } else {
                doCopy = true;
            }

            if (doCopy) {
                LOGGER.debug("Updating config value of {} from [{}] to [{}]",
                        prop.getName(),
                        destPropValue,
                        sourcePropValue);
                prop.getSetter().invoke(destParent, sourcePropValue);
                if (updateAction != null) {
                    updateAction.accept(destParent, prop, sourcePropValue, destPropValue);
                }
            }
        } else {
            LOGGER.trace("Source value of {} is null but we are not copying nulls", sourcePropValue);
        }
    }
Deep copy the field values of stroom POJO object trees from source into dest.
Relies on the public getters/setters so private fields won't be copied.
NOTE: Only deep copies objects in packages starting with 'stroom'
Only non default source values will be copied, ie. the value in source
is equal to the value in vanillaObject.
stroom-util/src/main/java/stroom/util/config/FieldMapper.java