001package io.avaje.inject.spi;
002
003/**
004 * A Module that can be included in BeanScope.
005 */
006public interface Module {
007
008  /**
009   * Return the set of types this module explicitly provides to other modules.
010   */
011  Class<?>[] provides();
012
013  /**
014   * Return the types this module needs to be provided externally or via other modules.
015   */
016  Class<?>[] requires();
017
018  /**
019   * Return the packages this module needs to be provided via other modules.
020   */
021  Class<?>[] requiresPackages();
022
023  /**
024   * Return public classes of the beans that would be registered by this module.
025   * <p>
026   * This method allows code to use reflection to inspect the modules classes
027   * before the module is wired. This method is not required for DI wiring.
028   */
029  Class<?>[] classes();
030
031  /**
032   * Build all the beans.
033   */
034  void build(Builder builder);
035
036  /**
037   * Marker for custom scoped modules.
038   */
039  interface Custom extends Module {
040
041  }
042}