content: package com.github.aesteve.vertx.nubes.reflections.adapters;
  
  import com.github.aesteve.vertx.nubes.reflections.adapters.impl.DefaultParameterAdapter;
  import io.vertx.core.MultiMap;
  
  import java.util.HashMap;
  import java.util.Map;
  
  public class ParameterAdapterRegistry {
  
    private final Map<Class<?>, ParameterAdapter<?>> adapters;
    private final ParameterAdapter<Object> defaultParameterAdapter;
  
    private ParameterAdapterRegistry(ParameterAdapter<Object> defaultParameterAdapter) {
      adapters = new HashMap<>();
      this.defaultParameterAdapter = defaultParameterAdapter;
    }
  
    public ParameterAdapterRegistry() {
      this(new DefaultParameterAdapter());
    }
  
    public <T> void registerAdapter(Class<T> parameterClass, ParameterAdapter<T> adapter) {
      adapters.put(parameterClass, adapter);
    }
  
    @SuppressWarnings("unchecked")
    private <T> ParameterAdapter<T> getAdapter(Class<T> parameterClass) {
      return (ParameterAdapter<T>) adapters.get(parameterClass);
    }
  
    public ParameterAdapter<Object> getDefaultParameterAdapter() {
      return defaultParameterAdapter;
    }
  
    @SuppressWarnings("unchecked")
    public <T> T adaptParam(String value, Class<T> parameterClass) {
      ParameterAdapter<T> adapter = getAdapter(parameterClass);
      if (adapter != null) {
        return adapter.adaptParam(value, parameterClass);
      } else if (defaultParameterAdapter != null) {
        return (T) defaultParameterAdapter.adaptParam(value, parameterClass);
      }
      return null;
    }
  
    @SuppressWarnings("unchecked")
    public <T> T adaptParams(MultiMap values, Class<T> parameterClass) {
      ParameterAdapter<T> adapter = getAdapter(parameterClass);
      if (adapter != null) {
        return adapter.adaptParams(values, parameterClass);
      } else if (defaultParameterAdapter != null) {
        return (T) defaultParameterAdapter.adaptParams(values, parameterClass);
      }
      return null;
    }
  }
  