class DefaultValueGenerator {

    public Object generate(Object value) {
        if (value != null) {
            Class<?> clazz = value.getClass();

            if (clazz.isPrimitive()) {
                return Defaults.defaultValue(clazz);
            } else {
                Object defaultValue = BoxedDefaults.defaultValue(clazz);
                if (defaultValue == null) {
                    try {
                        defaultValue = clazz.newInstance();
                    } catch (InstantiationException e) {
                        return null;
                    } catch (IllegalAccessException e) {
                        return null;
                    }
                }

                return defaultValue;
            }
        }

        return null;
    }

}