package openmods.access; import com.google.common.base.Throwables; public abstract class ApiInstanceProvider<T> { public static class CachedInstance<T> extends ApiInstanceProvider<T> { private final T instance; public CachedInstance(Class<? extends T> cls) { try { instance = cls.newInstance(); } catch (Throwable t) { throw Throwables.propagate(t); } } @Override public T getInterface() { return instance; } @Override public String toString() { return "SingleInstanceProvider [instance=" + instance + "]"; } } public static class NewInstance<T> extends ApiInstanceProvider<T> { private final Class<? extends T> cls; public NewInstance(Class<? extends T> cls) { this.cls = cls; } @Override public T getInterface() { try { return cls.newInstance(); } catch (Throwable t) { throw Throwables.propagate(t); } } @Override public String toString() { return "NewInstanceProvider [cls=" + cls + "]"; } } public static class Singleton<T> extends ApiInstanceProvider<T> { private final T obj; public Singleton(T obj) { this.obj = obj; } @Override public T getInterface() { return obj; } @Override public String toString() { return "SingletonProvider [obj=" + obj + "]"; } } public abstract T getInterface(); }