private void fillObject(E entry, String[] data) {
		for (Field field : entry.getClass().getDeclaredFields()) {
			// check if there is a MapToColumn Annotation
			MapToColumn mapAnnotation = field.getAnnotation(MapToColumn.class);
			if (mapAnnotation != null) {
				// read the annotation column
				int column = mapAnnotation.column();

				// read the annotation type. If type is Default.class, then
				// the type of the field will be used.
				Class<?> type;
				if (mapAnnotation.type().equals(MapToColumn.Default.class)) {
					// use the field type
					type = field.getType();
				} else {
					// use the annotated type
					type = mapAnnotation.type();
				}

				// load the appropriate value processor
				ValueProcessor<?> vp = provider.getValueProcessor(type);

				// use the value processor to convert the string data
				Object value = vp.processValue(data[column]);
				
				// make the field accessible and remember its state 
				boolean wasAccessible = field.isAccessible();
				field.setAccessible(true);
				
				// try to set the field's value
				try {
					field.set(entry, value);
				} catch (IllegalArgumentException iae) {
					throw new RuntimeException(String.format("can not set value %s for type %s", value, type), iae);
				} catch (IllegalAccessException iae) {
					throw new RuntimeException(String.format("can not access field %s", field), iae);
				}
				
				// re-set the accessible flag
				field.setAccessible(wasAccessible);
			}
		}
	}