ProjectAres/PGM/src/main/java/tc/oc/pgm/match/inject/MatchModuleManifest.java

56 lines
1.7 KiB
Java

package tc.oc.pgm.match.inject;
import java.util.Optional;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Provider;
import com.google.inject.TypeLiteral;
import org.bukkit.event.Listener;
import tc.oc.commons.core.reflect.Types;
import tc.oc.pgm.match.Match;
import tc.oc.pgm.match.MatchModule;
import tc.oc.pgm.match.MatchModuleContext;
import tc.oc.pgm.module.ModuleLoadException;
import tc.oc.pgm.module.ModuleManifest;
/**
* Base manifest for configuring a {@link MatchModule}
*
* If the module has the @ApiRequired annotation, and there is no API connection,
* the module is not provisioned.
*
* If the module returns false from its {@link MatchModule#shouldLoad()} method,
* it is discarded.
*/
public abstract class MatchModuleManifest<M extends MatchModule> extends ModuleManifest<MatchModule, MatchScoped, MatchModuleContext, M> {
protected MatchModuleManifest() {
this(null);
}
protected MatchModuleManifest(@Nullable TypeLiteral<M> type) {
super(type);
}
@Override
protected void configure() {
super.configure();
// Register the module as a Listener if it is one
if(Types.isAssignable(Listener.class, type)) {
matchOptionalListener((Class<? extends Listener>) rawType);
}
}
@Inject protected Provider<Match> matchProvider;
@Override
protected final Optional<M> provisionModuleWithoutDependencies() throws ModuleLoadException {
return provisionModuleWithoutFiltering()
.filter(MatchModule::shouldLoad);
}
protected abstract Optional<M> provisionModuleWithoutFiltering() throws ModuleLoadException;
}