package tc.oc.pgm.match;
import java.util.Optional;
import javax.inject.Inject;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
import org.bukkit.World;
import tc.oc.commons.core.inject.HybridManifest;
import tc.oc.commons.core.inject.InjectionScopable;
import tc.oc.commons.core.inject.InjectionScope;
import tc.oc.commons.core.inject.InjectionStore;
import tc.oc.commons.core.util.Optionals;
import tc.oc.commons.core.util.ThrowingSupplier;
import tc.oc.pgm.match.inject.MatchScoped;
import tc.oc.pgm.module.ModuleLoadException;
public class MatchInjectionScope extends InjectionScope<MatchScoped> {
@Inject private MatchFinder matchFinder;
@Override
protected Optional<InjectionStore<MatchScoped>> currentStore(Key<?> key) {
return Optionals.first(
super.currentStore(key),
Optional.ofNullable(matchFinder)
.flatMap(MatchFinder::currentMatch)
.map(InjectionScopable::injectionStore)
);
}
public <T> T withNewStore(World world, ThrowingSupplier<T, ModuleLoadException> block) throws ModuleLoadException {
final InjectionStore<MatchScoped> store = new InjectionStore<>();
store.store(Key.get(World.class), world);
return withCurrentStore(store, block);
}
public class Manifest extends HybridManifest {
@Override
protected void configure() {
publicBinder().bindScope(MatchScoped.class, MatchInjectionScope.this);
bind(scopeKey()).to(MatchInjectionScope.class);
bind(MatchInjectionScope.class).toInstance(MatchInjectionScope.this);
bindSeeded(binder(), storeKey());
bindSeeded(binder(), Key.get(World.class));
}
}
}