package tc.oc.commons.core.inject;
import javax.inject.Inject;
import com.google.inject.MembersInjector;
import com.google.inject.TypeLiteral;
import tc.oc.commons.core.reflect.ResolvableType;
/**
* Hacky replacement for broken {@link com.google.inject.Binder#requestInjection(TypeLiteral, Object)}
*/
public class InjectionRequest<T> extends Manifest {
private final T instance;
private final TypeLiteral<T> type;
public InjectionRequest(T instance, TypeLiteral<T> type) {
this.instance = instance;
this.type = type;
}
protected InjectionRequest(T instance) {
this.instance = instance;
this.type = new ResolvableType<T>(){}.in(getClass());
}
@Override
public int hashCode() {
return System.identityHashCode(instance);
}
@Override
public boolean equals(Object that) {
return this == that || (that instanceof InjectionRequest &&
this.instance == ((InjectionRequest) that).instance);
}
@Override
protected void configure() {
requestInjection(this);
injector = getMembersInjector(type);
}
private MembersInjector<T> injector;
@Inject private void inject() {
injector.injectMembers(instance);
}
}