code: @VisibleForTesting
    protected Shell createShell(final IO io, final Variables variables, final Branding branding) throws Exception {
      log.debug("Creating shell instance");
  
      List<Module> modules = new ArrayList<>();
  
      URLClassSpace space = new URLClassSpace(getClass().getClassLoader());
      modules.add(new SpaceModule(space, BeanScanning.INDEX));
  
      final BeanContainer container = new BeanContainer();
      modules.add(BeanContainer.module(container));
      modules.add(binder -> {
        binder.bind(ThreadIO.class).toInstance(threadIO);
        binder.bind(Branding.class).toInstance(branding);
        binder.bind(ShellBuilder.class).to(ShellBuilderImpl.class);
      });
  
      configure(modules);
  
      Injector injector = Guice.createInjector(new WireModule(modules));
      // injector is automatically bound to BeanLocator by sisu
  
      return injector.getInstance(ShellBuilder.class)
        .branding(branding)
        .io(io)
        .variables(variables)
        .build();
    }
docs: Create a new {@link Shell}.