/** {@inheritDoc} */
  public Object mapRecord(Record record) throws RecordMappingException {

    List<Field> fields = record.getFields();

    Object instance;
    try {
      // create a new instance of the returned object
      instance = recordClass.newInstance();

      // for each field
      for (Field field : fields) {

        // get field content and index
        String content = field.getContent();
        int index = field.getIndex();

        // convert the String raw value to field type
        Object typedValue = null;
        Class<?> type = recordClassSetters[index].getParameterTypes()[0];
        TypeConverter typeConverter = typeConverters.get(type);
        if (typeConverter != null) {
          typedValue = typeConverter.convert(content);
        }

        // set the typed value to the object field
        recordClassSetters[index].invoke(instance, typedValue);

        /*
         * Note : using java.lang.reflect.Field.set(instance, typedValue) throws an IllegalAccessException :
         * Class io.github.benas.cb4j.core.impl.DefaultRecordMapperImpl can not access a member of class X with modifiers "private"
         * even if a setter is provided
         */
      }
    } catch (InstantiationException e) {
      throw new RecordMappingException(
          "An exception occurred during record mapping : could not create a new instance.", e);
    } catch (IllegalAccessException e) {
      throw new RecordMappingException(
          "An exception occurred during record mapping : could not access class/field.", e);
    } catch (InvocationTargetException e) {
      throw new RecordMappingException(
          "An exception occurred during record mapping : could not invoke setter.", e);
    }

    return instance;
  }
 /** {@inheritDoc} */
 public boolean isValid(Field field) {
   return super.isValid(field) && field.getContent().length() >= minLength;
 }