package tc.oc.pgm.match.inject;
import java.util.List;
import javax.annotation.Nullable;
import javax.inject.Provider;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
import tc.oc.commons.core.inject.Keys;
import tc.oc.commons.core.reflect.ResolvableType;
import tc.oc.pgm.features.FeatureDefinition;
import tc.oc.pgm.match.MatchModule;
/**
* Configure a match module {@link M} that loads if and only if at least one instance of feature {@link F} is defined.
*
* A binding for List<F> must exist.
*/
public class MatchModuleFeatureManifest<M extends MatchModule, F extends FeatureDefinition> extends MatchModuleFixtureManifest<M> {
private final TypeLiteral<F> featureType;
protected MatchModuleFeatureManifest() {
this(null, null);
}
public MatchModuleFeatureManifest(@Nullable TypeLiteral<M> moduleType, @Nullable TypeLiteral<F> featureType) {
super(moduleType);
this.featureType = featureType != null ? featureType : new ResolvableType<F>(){}.in(getClass());
}
@Override
protected void configure() {
super.configure();
featureListProvider = getProvider(Keys.listOf(Key.get(featureType)));
}
private Provider<List<F>> featureListProvider;
@Override
protected boolean shouldLoad() {
return !featureListProvider.get().isEmpty();
}
}