private static void handleProperty(DocumentProperty existing, Object proposedValue, String key) {
        // The block of this is intentionally left empty so that the
        // conditions are evaluated until one of them return true.
        if (setPropertyIf(String.class,  proposedValue, casted -> existing.stringPropertyOf(key,  () -> casted))
            ||  setPropertyIf(Boolean.class, proposedValue, casted -> existing.booleanPropertyOf(key, () -> casted))
            ||  setPropertyIf(Integer.class, proposedValue, casted -> existing.integerPropertyOf(key, () -> casted))
            ||  setPropertyIf(Long.class,    proposedValue, casted -> existing.longPropertyOf(key,    () -> casted))
            ||  setPropertyIf(Float.class,   proposedValue, casted -> existing.doublePropertyOf(key,  () -> casted))
            ||  setPropertyIf(Double.class,  proposedValue, casted -> existing.doublePropertyOf(key,  () -> casted))
            ||  setPropertyIf(Byte.class,    proposedValue, casted -> existing.integerPropertyOf(key,  () -> casted))
            ||  setPropertyIf(Short.class,   proposedValue, casted -> existing.integerPropertyOf(key,  () -> casted)))
        {
            // Do nothing
        } else {
            throw new SpeedmentConfigException(
                "Property was not of any known type."
            );
        }
    }
Merges a single document into an existing one, trying to save as much
information as possible. If new {@link DocumentProperty properties} need
to be created, the specified constructor is used.

@param existing     the document to merge into
@param proposed     the document to merge with
@param constructor  used to create new {@link DocumentProperty}
tool-parent/tool-config/src/main/java/com/speedment/tool/config/util/DocumentMerger.java