docs: public Injector createInjector(Collection<Module> additionalModules)
      {
          List<Module> localModules = Lists.newArrayList();
          
          // Add the discovered modules FIRST.  The discovered modules
          // are added, and will subsequently be configured, in module dependency 
          // order which will ensure that any singletons bound in these modules 
          // will be created in the same order as the bind() calls are made.
          // Note that the singleton ordering is only guaranteed for 
          // singleton scope.
          
          //Add the LifecycleListener module
          localModules.add(new LifecycleListenerModule());
          localModules.add(new AbstractModule() {
              @Override
              public void configure() {
                  if (requireExplicitBindings) {
                      binder().requireExplicitBindings();
                  }                              
              }
          });
         
          if ( additionalModules != null )
          {
              localModules.addAll(additionalModules);
          }
          
          localModules.addAll(modules);
  
          // Finally, add the AutoBind module, which will use classpath scanning
          // to creating singleton bindings.  These singletons will be instantiated
          // in an indeterminate order but are guaranteed to occur AFTER singletons
          // bound in any of the discovered modules.
          if ( !ignoreAllClasses )
          {
              Collection<Class<?>>    localIgnoreClasses = Sets.newHashSet(ignoreClasses);
              localModules.add(new InternalAutoBindModule(injector, scanner, localIgnoreClasses));
          }
  
          return createChildInjector(localModules);
      }