package sk.stuba.fiit.perconik.core.services.listeners; import com.google.common.base.Supplier; import sk.stuba.fiit.perconik.core.Listener; import sk.stuba.fiit.perconik.utilities.reflect.accessor.DelayedLookup; final class StaticListenerLookup<L extends Listener> implements Supplier<L> { private final DelayedLookup<L> lookup; private StaticListenerLookup(final DelayedLookup<L> lookup) { this.lookup = lookup; } static <L extends Listener> StaticListenerLookup<L> forClass(final Class<L> type) { DelayedLookup.Builder<L> builder = DelayedLookup.builder(); builder.enumConstant(type, "INSTANCE"); builder.enumConstant(type, "instance"); builder.classMethod(type, type, "getInstance"); builder.classConstant(type, type, "INSTANCE"); builder.classConstant(type, type, "instance"); builder.classConstructor(type); return new StaticListenerLookup<>(builder.build()); } public L get() { return this.lookup.get(); } }