package openmods.config.game; import com.google.common.base.Preconditions; import com.google.common.base.Throwables; import com.google.common.collect.Maps; import java.util.Map; public class FactoryRegistry<T> { public interface Factory<T> { public T construct(); } private final Map<String, Factory<T>> customFactories = Maps.newHashMap(); public void registerFactory(String feature, Factory<T> factory) { customFactories.put(feature, factory); } public <C extends T> C construct(String feature, Class<? extends C> cls) { Factory<T> customFactory = customFactories.get(feature); if (customFactory != null) { @SuppressWarnings("unchecked") C result = (C)customFactory.construct(); Preconditions.checkArgument(cls.isInstance(result), "Invalid class for feature entry '%s', got '%s', expected '%s'", feature, result != null? result.getClass().toString() : "null", cls); return result; } try { return cls.newInstance(); } catch (Exception e) { throw Throwables.propagate(e); } } }