An interface for module implementations to identify modules that have
module extensions attached to them. A container that implements a Module
or a ToolsModule may choose to additionally mark it as Extensible in
case it wants to support extensions.
Module extensions are driven through various life cycle states along with the
extensible module that created them. The ordering of a module extension
relative to the extensible module and relative to each other is dependent on
certain attributes obtained from the module extension itself.
Module extensions are created for an extensible module right after the
phase where descriptors are parsed. For deployment, module extensions are
created after Module initialization and for tools, the module extensions
are created after ToolsModule compile or merge.
During module extension creation, getModuleExtensionContext is invoked
to obtain the context for extension creation. If the extensible module
implementation wishes to disable extension creation, a null must be
returned. Extension creation is then abandoned for the extensible module
and other methods are not invoked.