docs: public MongoClientOptions buildOptions() {
  		MongoClientOptions.Builder optionsBuilder = MongoClientOptions.builder();
  
  		optionsBuilder.writeConcern( writeConcern );
  		optionsBuilder.readConcern( readConcern );
  		optionsBuilder.readPreference( readPreference );
  
  		Map<String, Method> settingsMap = createSettingsMap();
  		for ( Map.Entry<String, Method> entry : settingsMap.entrySet() ) {
  			String setting = MongoDBProperties.MONGO_DRIVER_SETTINGS_PREFIX + "." + entry.getKey();
  			// we know that there is exactly one parameter
  			Class<?> type = entry.getValue().getParameterTypes()[0];
  
  			// for reflection purposes we need to deal with wrapper classes
  			if ( int.class.equals( type ) ) {
  				type = Integer.class;
  			}
  			if ( boolean.class.equals( type ) ) {
  				type = Boolean.class;
  			}
  
  			Object property = propertyReader.property( setting, type ).withDefault( null ).getValue();
  			if ( property == null ) {
  				continue;
  			}
  
  			Method settingMethod = entry.getValue();
  			try {
  				settingMethod.invoke( optionsBuilder, property );
  			}
  			catch ( InvocationTargetException | IllegalAccessException e ) {
  				throw log.unableToInvokeMethodViaReflection(
  						settingMethod.getDeclaringClass().getName(),
  						settingMethod.getName()
  				);
  			}
  		}
  
  		return optionsBuilder.build();
  	}