private void saveField(Object object, Class<?> clazz, Field field, Setting setting,
            ConfigurationNode node) throws ConfigurationException,
            IllegalArgumentException, IllegalAccessException, InstantiationException {

        String path = getSettingPath(field, setting);
        Object value = field.get(object);

        CollectionOf collectionOf;
        KeyValueOf keyValueOf;
        Of of;

        if (value == null) {
            field.set(object, null);
            return;
        }

        if (handleSave(node, path, setting, value) == true) {
            return;
        // collectionOf()
        } else if ((collectionOf = field.getAnnotation(CollectionOf.class)) != null) {
            setCollectionOf(node, path, newInstance(collectionOf.value()), (Collection<?>) value);
        // keyValueOf()
        } else if ((keyValueOf = field.getAnnotation(KeyValueOf.class)) != null) {
            setKeyValueOf(node, path, newInstance(keyValueOf.value()), (Map<?, ?>) value);
        // getOf()
        } else if ((of = field.getAnnotation(Of.class)) != null) {
            set(node, path, newInstance(of.value()), value);
        } else {
            field.set(object, value);
        }
    }