@@ -0,0 +1,1402 @@
+package org.rocket.network.guice;%0A%0Aimport com.google.inject.Binder;%0Aimport com.google.inject.Inject;%0Aimport com.google.inject.Injector;%0Aimport com.google.inject.PrivateBinder;%0Aimport com.google.inject.multibindings.Multibinder;%0Aimport org.rocket.network.Controller;%0Aimport org.rocket.network.ControllerFactory;%0Aimport org.rocket.network.NetworkClient;%0A%0Aimport java.util.Set;%0A%0Apublic abstract class ClientControllerModule extends BaseControllerModule %7B%0A    private PrivateBinder controllerBinder;%0A    private Multibinder%3CObject%3E controllerMultibinder;%0A%0A    @Override%0A    protected void before() %7B%0A        controllerBinder = binder().newPrivateBinder();%0A        controllerMultibinder = Multibinder.newSetBinder(controllerBinder, Object.class, Controller.class);%0A    %7D%0A%0A    @Override%0A    protected void after() %7B%0A        controllerBinder.bind(ControllerFactory.class).to(Hook.class);%0A        controllerBinder.expose(ControllerFactory.class);%0A    %7D%0A%0A    @Override%0A    protected Multibinder%3CObject%3E controllerMultibinder() %7B%0A        return controllerMultibinder;%0A    %7D%0A%0A    @Override%0A    protected Binder controllerBinder() %7B%0A        return controllerBinder;%0A    %7D%0A%0A    static class Hook implements ControllerFactory %7B%0A        @Inject Injector injector;%0A%0A        @Override%0A        public Set%3CObject%3E create(NetworkClient client) %7B%0A            return injector.getInstance(CONTROLLERS_KEY);%0A        %7D%0A    %7D%0A%7D%0A

create a ClientControllerModule not locally injecting a NetworkClient as ControllerModule would