public void addMapping(Field field, String csvField) throws ClassValidationException {
		if (fieldToCSVMapping.containsKey(field)) {
			logger.log(Level.WARNING, "Field: " + field + " already existing in mapping - is it duplicated? Ignoring");
			return;
		}

		if (csvToFieldMapping.containsKey(csvField)) {
			logger.log(Level.WARNING, "CSV Field: " + field + " already existing in mapping - is it duplicated? Ignoring");
			return;
		}

		CSVField fieldAnnotation = field.getAnnotation(CSVField.class);
		ICSVTypeConverter<?> converter = null;
		boolean nullable = true;
		if (fieldAnnotation != null) {

			nullable = fieldAnnotation.nullable();

			try {
				converter = fieldAnnotation.converter().newInstance();
			}
			catch (InstantiationException e) {
				throw new ClassValidationException("Unable to instanciate converter " + fieldAnnotation.converter().getName() + " make sure it contains default constructor", e);
			}
			catch (IllegalAccessException e) {
				throw new ClassValidationException("Could not access default constructor for converter " + fieldAnnotation.converter().getName(), e);
			}

		} else {
			converter = new MarkerConverter();
		}

		if (converters.containsKey(csvField)) {
			logger.log(Level.WARNING, "CSV Field: " + field + " already existing in mapping - is it duplicated? Ignoring");
			return;
		}

		this.nullable.put(field, nullable);
		converters.put(field, converter);
		fieldToCSVMapping.put(field, csvField);
		csvToFieldMapping.put(csvField, field);
	}