Example example_layer-hierarchy
Part of the full Java 9 Jigsaw modules example suite.
|
Authors
Originally written by Martin Lehmann, Kristine Schaal and Rüdiger Grammes (cf. original repository). Migrated for Java Modules support documentation of Apache MavenTM in the course of the Maven Support & Care program by Gerd Aschemann (and other team members) as forked repository. Please add discussions, requirements, bugfixes, etc. to the fork instead of the original. |
What is this example about?
Layers in this example
The layer hierarchy as persisted in layers_triple_hierarchy.json defines the following layer structure:
-
layer
toplayeron level top (parent is the boot layer)-
layer
middlelayer_1on level middle (parent istoplayer)-
layer
bottomlayer_1aon level bottom (parent ismiddlelayer_1) -
layer
bottomlayer_1bon level bottom (parent ismiddlelayer_1)
-
-
layer middlelayer_2` on level middle (parent is toplayer)
-
layer
bottomlayer_2aon level bottom (parent ismiddlelayer_2) -
layer
bottomlayer_2bon level bottom (parent ismiddlelayer_2)
-
-
Modules in this example
-
mod.layercontains a layer tree data structure (built up when reading a JSON file likelayers_triple_hierarchy.json) -
mod.maincontains the main class which-
builts up the layers and
-
calls the
doIt()in all modules in all layers
-
All other modules are put automatically to a Jigsaw layer based on their naming convention (module name’s suffix matches layer level).
See modmain/pkgmain.LayerBuilder.java:
-
mod.x_bottom(in layer bottom),mod.x_middle(in layer middle),mod.x_top(in layer top) all have the same package (pkgx) and same class name.-
At runtime, the split package problem does not occur because these modules are loaded in different layers - each layer has its own instance of
pkgx. -
However, at compile time, a split package problem occurs due to the automatic module
javax.json(see explanation below).
-
-
mod.y_bottom(in layer bottom),mod.y_middle(in layer middle),mod.y_top(in layer top) use different packages.-
A class in bottom is derived from one in middle which is derived from top.
-
-
mod.z_bottom(in layer bottom),mod.z_middle(in layer middle),mod.z_top(in layer top) use different packages.-
Similar to the
Yexample except that theZ*classes are not derived from each other but use delegation (from bottom→middle, from middle→top).
-
-
mod.zreverse_bottom(in layer top),mod.zreverse_middle(in layer top),mod.zreverse_top(in layer top) use different packages.-
Similar to the
Zexample except that the order is "reversed". Because of that, all modules already end up in the top layer, because top requires middle which requires bottom.
-
-
mod.u_bottom_middle_top(in layer top) is a module, which could theoretically end up in all layers but is already resolved in top layer.
Understanding the "Reads" Relationship and Split Package Problem
Java Modules "Reads" Semantics
In Java Modules, when module A "reads" module B, it means:
-
Module A has access to all packages that module B exports
-
This is established via
requiresdeclarations inmodule-info.javafor explicit modules -
For automatic modules (JARs without
module-info.javaon the module-path), the rules are different:-
An automatic module automatically reads ALL modules on the module-path (both explicit and automatic)
-
An automatic module automatically exports all its packages
-
The javax.json Automatic Module Problem
In this example:
-
mod.maindeclaresrequires javax.jsonto read the JSON configuration file -
javax.jsonis placed inamlib/as an automatic module (JAR withoutmodule-info.java) -
Because
javax.jsonis automatic, it automatically reads all modules on the module-path, including:-
mod.x_bottom(exportspkgx) -
mod.x_middle(exportspkgx) -
mod.x_top(exportspkgx)
-
Compile-Time vs. Runtime Behavior
At Compile Time:
-
All modules are on the
--module-path:mlib(application modules) +amlib(javax.json) -
The compiler sees that
javax.jsonreads three modules that all export the same packagepkgx -
This violates the Java Modules rule: "A module cannot read two modules that export the same package"
-
Result: Compilation fails with a split package error
Workaround: The mod.x_* modules must be compiled separately (see compile.sh lines 7-14), so they are never all on the module-path simultaneously when javax.json is present.
At Runtime:
-
Modules are loaded into different layers according to their names (
_bottom,_middle,_top) -
Each layer maintains its own module namespace
-
The same package
pkgxcan exist in multiple layers without conflict -
javax.jsonis only in the boot layer and only "sees" modules in the boot layer at runtime -
Result: No split package problem occurs - each layer has its own isolated instance of
pkgx
|
This demonstrates an important aspect of Java Modules: layer isolation at runtime provides stronger encapsulation than what’s possible at compile time with automatic modules. The compile-time restriction is necessary because automatic modules have automatic reads to all modules, but at runtime, layers provide the isolation needed to avoid conflicts. For more details, see this discussion in the jigsaw-dev mailing list. |
Example shows …
-
The example shows how a layer hierarchy can be built up (see
mod.main/pkgmain.LayerBuilderandmod.layers/pkglayer.*.java, in the Jigsaw boot layer)-
For that hierarcy, we use a tree of layers in our own tree/composite-pattern data structure (see
mod.layer). Each of the tree nodes has a name, a level and keeps the reference to a Jigsaw layer. -
This layer tree hierarchy is read from a JSON file.
-
Each name of a layer tree node must be globally unique.
-
Modules (
mod.u*,mod.x*,mod.y*,mod.z*) are added to the layers (see section "Modules …" above).
-
-
The example shows also how modules in different layers can interact with each other via derivation and delegation (see section "Modules …").
-
Finally, the examples shows how one can call any other class in any other module in the layer hierarchy via reflection (see
mod.main/pkgmain.ModuleCaller, in the Jigsaw boot layer).
Maven 4 Migration
This example has been migrated to Maven 4 using the Module Source Hierarchy layout with symbolic links to the original source directories.
Migration Challenges
The primary challenge in this migration is the split package problem at compile time caused by the automatic module javax.json.
The Problem:
-
Three modules (
mod.x_bottom,mod.x_middle,mod.x_top) all export packagepkgx -
At runtime, this works fine because modules are loaded into different layers (layer isolation)
-
At compile time, the automatic module
javax.jsonautomatically reads all modules on the module-path -
This creates a compile-time conflict:
javax.jsonwould read three modules exporting the same package
Migration Approach
The Maven 4 migration uses a hybrid compilation strategy:
Phase 1 - Manual compilation of mod.x modules:
The compile.sh script manually compiles the three mod.x_* modules separately using javac to avoid having them all on the module-path simultaneously.
# Compile mod.x_* modules separately (split package problem with automatic module)
for modx in mod.x_bottom mod.x_middle mod.x_top; do
javac --release 11 -d target/classes \
--module-path target:amlib \
--module-source-path "src/*/main/java" \
$(find -L src/${modx}/main/java -name "*.java")
done
# Package as JARs in target/ (accessible via mlib symlink)
pushd target/classes > /dev/null
for modx in mod.x_bottom mod.x_middle mod.x_top; do
jar --create --file=../${modx}.jar -C ${modx} .
done
popd > /dev/null
Phase 2 - Maven compilation of remaining modules:
Maven 4 compiles all other modules (mod.main, mod.layer, mod.y_*, mod.z_*, etc.) using the Module Source Hierarchy.
Technical Implementation
Symbolic link structure:
The migration uses symbolic links from m4/src/<module>/main/java to ../../../../src/<module>:
m4/src/mod.main/main/java -> ../../../../src/mod.main
m4/src/mod.layer/main/java -> ../../../../src/mod.layer
m4/src/mod.y_bottom/main/java -> ../../../../src/mod.y_bottom
... (and all other non-x modules)
These symbolic links are checked into Git and do not need to be created dynamically.
pom.xml configuration:
The pom.xml uses Maven 4.1.0 model and declares all modules except the mod.x_* modules (which are compiled manually):
<sources>
<source>
<module>mod.main</module>
<directory>src/mod.main/main/java</directory>
</source>
<source>
<module>mod.layer</module>
<directory>src/mod.layer/main/java</directory>
</source>
<!-- ... all other modules except mod.x_* ... -->
</sources>
Dependency on automatic module:
The automatic module javax.json is downloaded via maven-dependency-plugin to amlib/:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/../amlib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
Dynamic module loading via mlib:
The Java code in mod.main/pkgmain/Main.java uses the ModuleLayer API to dynamically load modules at runtime from a hardcoded path:
layerBuilder.createJigsawLayers(LayerHierarchy.root, LayerHierarchy.root.getLayer(), path + "/mlib");
Since Maven (4) creates JARs in the target/ directory (not mlib/), but the shared source code still references mlib, the run.sh script creates mlib using OS-specific approaches:
- Unix/macOS
-
Creates symlink
mlib → target(usingln -sfn) - Windows
-
Creates directory
mlib/and copies JARs fromtarget/
The Windows approach avoids AccessDeniedException issues when Java’s ModuleLayer API traverses symlinks.
|
A committed symlink |
Output
This example uses golden master testing to ensure output consistency.
The expected output is compared with actual output using verify.sh.
Expected Output
Layer 'boot' on level 'root' (java.base, java.compiler, java.datatransfer, java.desktop, java.logging, java.management, java.management.rmi, java.naming, java.prefs, java.rmi, java.security.jgss, java.security.sasl, java.smartcardio, java.xml, java.xml.crypto, javax.json, jdk.charsets, jdk.compiler, jdk.crypto.cryptoki, jdk.crypto.ec, jdk.internal.opt, jdk.jartool, jdk.javadoc, jdk.jdeps, jdk.jfr, jdk.jlink, jdk.localedata, jdk.management, jdk.management.jfr, jdk.naming.dns, jdk.naming.rmi, jdk.security.auth, jdk.security.jgss, jdk.unsupported.desktop, jdk.zipfs, mod.layer, mod.main)
Contains these modules:
module java.base
module java.compiler
module java.datatransfer
module java.desktop
module java.logging
module java.management
module java.management.rmi
module java.naming
module java.prefs
module java.rmi
module java.security.jgss
module java.security.sasl
module java.smartcardio
module java.xml
module java.xml.crypto
module javax.json
module jdk.charsets
module jdk.compiler
module jdk.crypto.cryptoki
module jdk.crypto.ec
module jdk.internal.opt
module jdk.jartool
module jdk.javadoc
module jdk.jdeps
module jdk.jfr
module jdk.jlink
module jdk.localedata
module jdk.management
module jdk.management.jfr
module jdk.naming.dns
module jdk.naming.rmi
module jdk.security.auth
module jdk.security.jgss
module jdk.unsupported.desktop
module jdk.zipfs
module mod.layer
module mod.main
Layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top)
Parent 'boot' on level 'root' (java.base, java.compiler, java.datatransfer, java.desktop, java.logging, java.management, java.management.rmi, java.naming, java.prefs, java.rmi, java.security.jgss, java.security.sasl, java.smartcardio, java.xml, java.xml.crypto, javax.json, jdk.charsets, jdk.compiler, jdk.crypto.cryptoki, jdk.crypto.ec, jdk.internal.opt, jdk.jartool, jdk.javadoc, jdk.jdeps, jdk.jfr, jdk.jlink, jdk.localedata, jdk.management, jdk.management.jfr, jdk.naming.dns, jdk.naming.rmi, jdk.security.auth, jdk.security.jgss, jdk.unsupported.desktop, jdk.zipfs, mod.layer, mod.main)
Contains these modules:
module mod.u_bottom_middle_top
module mod.x_top
module mod.y_top
module mod.z_top
module mod.zreverse_bottom
module mod.zreverse_middle
module mod.zreverse_top
Layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Parent 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top)
Contains these modules:
module mod.x_middle
module mod.y_middle
module mod.z_middle
Layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom)
Parent 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Contains these modules:
module mod.x_bottom
module mod.y_bottom
module mod.z_bottom
Layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom)
Parent 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Contains these modules:
module mod.x_bottom
module mod.y_bottom
module mod.z_bottom
Layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Parent 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top)
Contains these modules:
module mod.x_middle
module mod.y_middle
module mod.z_middle
Layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom)
Parent 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Contains these modules:
module mod.x_bottom
module mod.y_bottom
module mod.z_bottom
Layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom)
Parent 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Contains these modules:
module mod.x_bottom
module mod.y_bottom
module mod.z_bottom
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.x* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.x_top'
Calling mod.x_top/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'middlelayer_1' on level 'middle'
Module 'mod.x_middle'
Calling mod.x_middle/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
Layer 'bottomlayer_1b' on level 'bottom'
Module 'mod.x_bottom'
Calling mod.x_bottom/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'bottomlayer_1a' on level 'bottom'
Module 'mod.x_bottom'
Calling mod.x_bottom/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'middlelayer_2' on level 'middle'
Module 'mod.x_middle'
Calling mod.x_middle/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
Layer 'bottomlayer_2a' on level 'bottom'
Module 'mod.x_bottom'
Calling mod.x_bottom/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'bottomlayer_2b' on level 'bottom'
Module 'mod.x_bottom'
Calling mod.x_bottom/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.y* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.y_top'
Calling mod.y_top/pkgy.top.YTopClass.doIt() returns:
pkgy.top.YTopClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'middlelayer_1' on level 'middle'
Module 'mod.y_middle'
Calling mod.y_middle/pkgy.middle.YMiddleClass.doIt() returns:
pkgy.middle.YMiddleClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgy.middle.YMiddleClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
Layer 'bottomlayer_1b' on level 'bottom'
Module 'mod.y_bottom'
Calling mod.y_bottom/pkgy.bottom.YBottomClass.doIt() returns:
pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.bottom.YBottomClass, module mod.y_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'bottomlayer_1a' on level 'bottom'
Module 'mod.y_bottom'
Calling mod.y_bottom/pkgy.bottom.YBottomClass.doIt() returns:
pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.bottom.YBottomClass, module mod.y_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'middlelayer_2' on level 'middle'
Module 'mod.y_middle'
Calling mod.y_middle/pkgy.middle.YMiddleClass.doIt() returns:
pkgy.middle.YMiddleClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgy.middle.YMiddleClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
Layer 'bottomlayer_2a' on level 'bottom'
Module 'mod.y_bottom'
Calling mod.y_bottom/pkgy.bottom.YBottomClass.doIt() returns:
pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.bottom.YBottomClass, module mod.y_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'bottomlayer_2b' on level 'bottom'
Module 'mod.y_bottom'
Calling mod.y_bottom/pkgy.bottom.YBottomClass.doIt() returns:
pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.bottom.YBottomClass, module mod.y_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.z* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.z_top'
Calling mod.z_top/pkgz.top.ZTopClass.doIt() returns:
pkgz.top.ZTopClass, id=ID_ModuleCaller_68 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'middlelayer_1' on level 'middle'
Module 'mod.z_middle'
Calling mod.z_middle/pkgz.middle.ZMiddleClass.doIt() returns:
pkgz.middle.ZMiddleClass, id=ID_ModuleCaller_68 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'bottomlayer_1b' on level 'bottom'
Module 'mod.z_bottom'
Calling mod.z_bottom/pkgz.bottom.ZBottomClass.doIt() returns:
pkgz.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgz.bottom.ZBottomClass, module mod.z_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgz.middle.ZMiddleClass, id=ID_ZBottomClass_24 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'bottomlayer_1a' on level 'bottom'
Module 'mod.z_bottom'
Calling mod.z_bottom/pkgz.bottom.ZBottomClass.doIt() returns:
pkgz.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgz.bottom.ZBottomClass, module mod.z_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgz.middle.ZMiddleClass, id=ID_ZBottomClass_24 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'middlelayer_2' on level 'middle'
Module 'mod.z_middle'
Calling mod.z_middle/pkgz.middle.ZMiddleClass.doIt() returns:
pkgz.middle.ZMiddleClass, id=ID_ModuleCaller_68 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'bottomlayer_2a' on level 'bottom'
Module 'mod.z_bottom'
Calling mod.z_bottom/pkgz.bottom.ZBottomClass.doIt() returns:
pkgz.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgz.bottom.ZBottomClass, module mod.z_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgz.middle.ZMiddleClass, id=ID_ZBottomClass_24 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'bottomlayer_2b' on level 'bottom'
Module 'mod.z_bottom'
Calling mod.z_bottom/pkgz.bottom.ZBottomClass.doIt() returns:
pkgz.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgz.bottom.ZBottomClass, module mod.z_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgz.middle.ZMiddleClass, id=ID_ZBottomClass_24 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.zreverse* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.zreverse_bottom'
Calling mod.zreverse_bottom/pkgzreverse.bottom.ZBottomClass.doIt() returns:
pkgzreverse.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgzreverse.bottom.ZBottomClass, module mod.zreverse_bottom, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'toplayer' on level 'top'
Module 'mod.zreverse_middle'
Calling mod.zreverse_middle/pkgzreverse.middle.ZMiddleClass.doIt() returns:
pkgzreverse.middle.ZMiddleClass, id=ID_ModuleCaller_68 [ class pkgzreverse.middle.ZMiddleClass, module mod.zreverse_middle, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
plus pkgzreverse.bottom.ZBottomClass, id=ID_ZMiddleClass_24 [ class pkgzreverse.bottom.ZBottomClass, module mod.zreverse_bottom, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'toplayer' on level 'top'
Module 'mod.zreverse_top'
Calling mod.zreverse_top/pkgzreverse.top.ZTopClass.doIt() returns:
pkgzreverse.top.ZTopClass, id=ID_ModuleCaller_68 [ class pkgzreverse.top.ZTopClass, module mod.zreverse_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
plus pkgzreverse.middle.ZMiddleClass, id=ID_ZTopClass_24 [ class pkgzreverse.middle.ZMiddleClass, module mod.zreverse_middle, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
plus pkgzreverse.bottom.ZBottomClass, id=ID_ZMiddleClass_24 [ class pkgzreverse.bottom.ZBottomClass, module mod.zreverse_bottom, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.u* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.u_bottom_middle_top'
Calling mod.u_bottom_middle_top/pkgu.U.doIt() returns:
pkgu.U, id=ID_ModuleCaller_68 [ class pkgu.U, module mod.u_bottom_middle_top, layer toplayer on level top (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Actual Output
Layer 'boot' on level 'root' (java.base, java.compiler, java.datatransfer, java.desktop, java.logging, java.management, java.management.rmi, java.naming, java.prefs, java.rmi, java.security.jgss, java.security.sasl, java.smartcardio, java.xml, java.xml.crypto, javax.json, jdk.charsets, jdk.compiler, jdk.crypto.cryptoki, jdk.crypto.ec, jdk.internal.opt, jdk.jartool, jdk.javadoc, jdk.jdeps, jdk.jfr, jdk.jlink, jdk.localedata, jdk.management, jdk.management.jfr, jdk.naming.dns, jdk.naming.rmi, jdk.security.auth, jdk.security.jgss, jdk.unsupported.desktop, jdk.zipfs, mod.layer, mod.main)
Contains these modules:
module java.base
module java.compiler
module java.datatransfer
module java.desktop
module java.logging
module java.management
module java.management.rmi
module java.naming
module java.prefs
module java.rmi
module java.security.jgss
module java.security.sasl
module java.smartcardio
module java.xml
module java.xml.crypto
module javax.json
module jdk.charsets
module jdk.compiler
module jdk.crypto.cryptoki
module jdk.crypto.ec
module jdk.internal.opt
module jdk.jartool
module jdk.javadoc
module jdk.jdeps
module jdk.jfr
module jdk.jlink
module jdk.localedata
module jdk.management
module jdk.management.jfr
module jdk.naming.dns
module jdk.naming.rmi
module jdk.security.auth
module jdk.security.jgss
module jdk.unsupported.desktop
module jdk.zipfs
module mod.layer
module mod.main
Layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top)
Parent 'boot' on level 'root' (java.base, java.compiler, java.datatransfer, java.desktop, java.logging, java.management, java.management.rmi, java.naming, java.prefs, java.rmi, java.security.jgss, java.security.sasl, java.smartcardio, java.xml, java.xml.crypto, javax.json, jdk.charsets, jdk.compiler, jdk.crypto.cryptoki, jdk.crypto.ec, jdk.internal.opt, jdk.jartool, jdk.javadoc, jdk.jdeps, jdk.jfr, jdk.jlink, jdk.localedata, jdk.management, jdk.management.jfr, jdk.naming.dns, jdk.naming.rmi, jdk.security.auth, jdk.security.jgss, jdk.unsupported.desktop, jdk.zipfs, mod.layer, mod.main)
Contains these modules:
module mod.u_bottom_middle_top
module mod.x_top
module mod.y_top
module mod.z_top
module mod.zreverse_bottom
module mod.zreverse_middle
module mod.zreverse_top
Layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Parent 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top)
Contains these modules:
module mod.x_middle
module mod.y_middle
module mod.z_middle
Layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom)
Parent 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Contains these modules:
module mod.x_bottom
module mod.y_bottom
module mod.z_bottom
Layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom)
Parent 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Contains these modules:
module mod.x_bottom
module mod.y_bottom
module mod.z_bottom
Layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Parent 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top)
Contains these modules:
module mod.x_middle
module mod.y_middle
module mod.z_middle
Layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom)
Parent 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Contains these modules:
module mod.x_bottom
module mod.y_bottom
module mod.z_bottom
Layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom)
Parent 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Contains these modules:
module mod.x_bottom
module mod.y_bottom
module mod.z_bottom
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.x* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.x_top'
Calling mod.x_top/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'middlelayer_1' on level 'middle'
Module 'mod.x_middle'
Calling mod.x_middle/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
Layer 'bottomlayer_1b' on level 'bottom'
Module 'mod.x_bottom'
Calling mod.x_bottom/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'bottomlayer_1a' on level 'bottom'
Module 'mod.x_bottom'
Calling mod.x_bottom/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'middlelayer_2' on level 'middle'
Module 'mod.x_middle'
Calling mod.x_middle/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
Layer 'bottomlayer_2a' on level 'bottom'
Module 'mod.x_bottom'
Calling mod.x_bottom/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'bottomlayer_2b' on level 'bottom'
Module 'mod.x_bottom'
Calling mod.x_bottom/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.y* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.y_top'
Calling mod.y_top/pkgy.top.YTopClass.doIt() returns:
pkgy.top.YTopClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'middlelayer_1' on level 'middle'
Module 'mod.y_middle'
Calling mod.y_middle/pkgy.middle.YMiddleClass.doIt() returns:
pkgy.middle.YMiddleClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgy.middle.YMiddleClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
Layer 'bottomlayer_1b' on level 'bottom'
Module 'mod.y_bottom'
Calling mod.y_bottom/pkgy.bottom.YBottomClass.doIt() returns:
pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.bottom.YBottomClass, module mod.y_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'bottomlayer_1a' on level 'bottom'
Module 'mod.y_bottom'
Calling mod.y_bottom/pkgy.bottom.YBottomClass.doIt() returns:
pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.bottom.YBottomClass, module mod.y_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'middlelayer_2' on level 'middle'
Module 'mod.y_middle'
Calling mod.y_middle/pkgy.middle.YMiddleClass.doIt() returns:
pkgy.middle.YMiddleClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgy.middle.YMiddleClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
Layer 'bottomlayer_2a' on level 'bottom'
Module 'mod.y_bottom'
Calling mod.y_bottom/pkgy.bottom.YBottomClass.doIt() returns:
pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.bottom.YBottomClass, module mod.y_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'bottomlayer_2b' on level 'bottom'
Module 'mod.y_bottom'
Calling mod.y_bottom/pkgy.bottom.YBottomClass.doIt() returns:
pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.bottom.YBottomClass, module mod.y_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.z* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.z_top'
Calling mod.z_top/pkgz.top.ZTopClass.doIt() returns:
pkgz.top.ZTopClass, id=ID_ModuleCaller_68 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'middlelayer_1' on level 'middle'
Module 'mod.z_middle'
Calling mod.z_middle/pkgz.middle.ZMiddleClass.doIt() returns:
pkgz.middle.ZMiddleClass, id=ID_ModuleCaller_68 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'bottomlayer_1b' on level 'bottom'
Module 'mod.z_bottom'
Calling mod.z_bottom/pkgz.bottom.ZBottomClass.doIt() returns:
pkgz.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgz.bottom.ZBottomClass, module mod.z_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgz.middle.ZMiddleClass, id=ID_ZBottomClass_24 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'bottomlayer_1a' on level 'bottom'
Module 'mod.z_bottom'
Calling mod.z_bottom/pkgz.bottom.ZBottomClass.doIt() returns:
pkgz.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgz.bottom.ZBottomClass, module mod.z_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgz.middle.ZMiddleClass, id=ID_ZBottomClass_24 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'middlelayer_2' on level 'middle'
Module 'mod.z_middle'
Calling mod.z_middle/pkgz.middle.ZMiddleClass.doIt() returns:
pkgz.middle.ZMiddleClass, id=ID_ModuleCaller_68 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'bottomlayer_2a' on level 'bottom'
Module 'mod.z_bottom'
Calling mod.z_bottom/pkgz.bottom.ZBottomClass.doIt() returns:
pkgz.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgz.bottom.ZBottomClass, module mod.z_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgz.middle.ZMiddleClass, id=ID_ZBottomClass_24 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'bottomlayer_2b' on level 'bottom'
Module 'mod.z_bottom'
Calling mod.z_bottom/pkgz.bottom.ZBottomClass.doIt() returns:
pkgz.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgz.bottom.ZBottomClass, module mod.z_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgz.middle.ZMiddleClass, id=ID_ZBottomClass_24 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.zreverse* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.zreverse_bottom'
Calling mod.zreverse_bottom/pkgzreverse.bottom.ZBottomClass.doIt() returns:
pkgzreverse.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgzreverse.bottom.ZBottomClass, module mod.zreverse_bottom, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'toplayer' on level 'top'
Module 'mod.zreverse_middle'
Calling mod.zreverse_middle/pkgzreverse.middle.ZMiddleClass.doIt() returns:
pkgzreverse.middle.ZMiddleClass, id=ID_ModuleCaller_68 [ class pkgzreverse.middle.ZMiddleClass, module mod.zreverse_middle, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
plus pkgzreverse.bottom.ZBottomClass, id=ID_ZMiddleClass_24 [ class pkgzreverse.bottom.ZBottomClass, module mod.zreverse_bottom, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'toplayer' on level 'top'
Module 'mod.zreverse_top'
Calling mod.zreverse_top/pkgzreverse.top.ZTopClass.doIt() returns:
pkgzreverse.top.ZTopClass, id=ID_ModuleCaller_68 [ class pkgzreverse.top.ZTopClass, module mod.zreverse_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
plus pkgzreverse.middle.ZMiddleClass, id=ID_ZTopClass_24 [ class pkgzreverse.middle.ZMiddleClass, module mod.zreverse_middle, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
plus pkgzreverse.bottom.ZBottomClass, id=ID_ZMiddleClass_24 [ class pkgzreverse.bottom.ZBottomClass, module mod.zreverse_bottom, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.u* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.u_bottom_middle_top'
Calling mod.u_bottom_middle_top/pkgu.U.doIt() returns:
pkgu.U, id=ID_ModuleCaller_68 [ class pkgu.U, module mod.u_bottom_middle_top, layer toplayer on level top (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Maven 4 Output
Layer 'boot' on level 'root' (java.base, java.compiler, java.datatransfer, java.desktop, java.logging, java.management, java.management.rmi, java.naming, java.prefs, java.rmi, java.security.jgss, java.security.sasl, java.smartcardio, java.xml, java.xml.crypto, javax.json, jdk.charsets, jdk.compiler, jdk.crypto.cryptoki, jdk.crypto.ec, jdk.internal.opt, jdk.jartool, jdk.javadoc, jdk.jdeps, jdk.jfr, jdk.jlink, jdk.localedata, jdk.management, jdk.management.jfr, jdk.naming.dns, jdk.naming.rmi, jdk.security.auth, jdk.security.jgss, jdk.unsupported.desktop, jdk.zipfs, mod.layer, mod.main)
Contains these modules:
module java.base
module java.compiler
module java.datatransfer
module java.desktop
module java.logging
module java.management
module java.management.rmi
module java.naming
module java.prefs
module java.rmi
module java.security.jgss
module java.security.sasl
module java.smartcardio
module java.xml
module java.xml.crypto
module javax.json
module jdk.charsets
module jdk.compiler
module jdk.crypto.cryptoki
module jdk.crypto.ec
module jdk.internal.opt
module jdk.jartool
module jdk.javadoc
module jdk.jdeps
module jdk.jfr
module jdk.jlink
module jdk.localedata
module jdk.management
module jdk.management.jfr
module jdk.naming.dns
module jdk.naming.rmi
module jdk.security.auth
module jdk.security.jgss
module jdk.unsupported.desktop
module jdk.zipfs
module mod.layer
module mod.main
Layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top)
Parent 'boot' on level 'root' (java.base, java.compiler, java.datatransfer, java.desktop, java.logging, java.management, java.management.rmi, java.naming, java.prefs, java.rmi, java.security.jgss, java.security.sasl, java.smartcardio, java.xml, java.xml.crypto, javax.json, jdk.charsets, jdk.compiler, jdk.crypto.cryptoki, jdk.crypto.ec, jdk.internal.opt, jdk.jartool, jdk.javadoc, jdk.jdeps, jdk.jfr, jdk.jlink, jdk.localedata, jdk.management, jdk.management.jfr, jdk.naming.dns, jdk.naming.rmi, jdk.security.auth, jdk.security.jgss, jdk.unsupported.desktop, jdk.zipfs, mod.layer, mod.main)
Contains these modules:
module mod.u_bottom_middle_top
module mod.x_top
module mod.y_top
module mod.z_top
module mod.zreverse_bottom
module mod.zreverse_middle
module mod.zreverse_top
Layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Parent 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top)
Contains these modules:
module mod.x_middle
module mod.y_middle
module mod.z_middle
Layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom)
Parent 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Contains these modules:
module mod.x_bottom
module mod.y_bottom
module mod.z_bottom
Layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom)
Parent 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Contains these modules:
module mod.x_bottom
module mod.y_bottom
module mod.z_bottom
Layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Parent 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top)
Contains these modules:
module mod.x_middle
module mod.y_middle
module mod.z_middle
Layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom)
Parent 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Contains these modules:
module mod.x_bottom
module mod.y_bottom
module mod.z_bottom
Layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom)
Parent 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle)
Contains these modules:
module mod.x_bottom
module mod.y_bottom
module mod.z_bottom
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.x* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.x_top'
Calling mod.x_top/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'middlelayer_1' on level 'middle'
Module 'mod.x_middle'
Calling mod.x_middle/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
Layer 'bottomlayer_1b' on level 'bottom'
Module 'mod.x_bottom'
Calling mod.x_bottom/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'bottomlayer_1a' on level 'bottom'
Module 'mod.x_bottom'
Calling mod.x_bottom/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'middlelayer_2' on level 'middle'
Module 'mod.x_middle'
Calling mod.x_middle/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
Layer 'bottomlayer_2a' on level 'bottom'
Module 'mod.x_bottom'
Calling mod.x_bottom/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'bottomlayer_2b' on level 'bottom'
Module 'mod.x_bottom'
Calling mod.x_bottom/pkgx.X.doIt() returns:
pkgx.X, id=ID_ModuleCaller_68 [ class pkgx.X, module mod.x_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.y* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.y_top'
Calling mod.y_top/pkgy.top.YTopClass.doIt() returns:
pkgy.top.YTopClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'middlelayer_1' on level 'middle'
Module 'mod.y_middle'
Calling mod.y_middle/pkgy.middle.YMiddleClass.doIt() returns:
pkgy.middle.YMiddleClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgy.middle.YMiddleClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
Layer 'bottomlayer_1b' on level 'bottom'
Module 'mod.y_bottom'
Calling mod.y_bottom/pkgy.bottom.YBottomClass.doIt() returns:
pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.bottom.YBottomClass, module mod.y_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'bottomlayer_1a' on level 'bottom'
Module 'mod.y_bottom'
Calling mod.y_bottom/pkgy.bottom.YBottomClass.doIt() returns:
pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.bottom.YBottomClass, module mod.y_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'middlelayer_2' on level 'middle'
Module 'mod.y_middle'
Calling mod.y_middle/pkgy.middle.YMiddleClass.doIt() returns:
pkgy.middle.YMiddleClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgy.middle.YMiddleClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
Layer 'bottomlayer_2a' on level 'bottom'
Module 'mod.y_bottom'
Calling mod.y_bottom/pkgy.bottom.YBottomClass.doIt() returns:
pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.bottom.YBottomClass, module mod.y_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
Layer 'bottomlayer_2b' on level 'bottom'
Module 'mod.y_bottom'
Calling mod.y_bottom/pkgy.bottom.YBottomClass.doIt() returns:
pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.bottom.YBottomClass, module mod.y_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.middle.YMiddleClass, module mod.y_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgy.bottom.YBottomClass, id=ID_ModuleCaller_68 [ class pkgy.top.YTopClass, module mod.y_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.z* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.z_top'
Calling mod.z_top/pkgz.top.ZTopClass.doIt() returns:
pkgz.top.ZTopClass, id=ID_ModuleCaller_68 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'middlelayer_1' on level 'middle'
Module 'mod.z_middle'
Calling mod.z_middle/pkgz.middle.ZMiddleClass.doIt() returns:
pkgz.middle.ZMiddleClass, id=ID_ModuleCaller_68 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'bottomlayer_1b' on level 'bottom'
Module 'mod.z_bottom'
Calling mod.z_bottom/pkgz.bottom.ZBottomClass.doIt() returns:
pkgz.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgz.bottom.ZBottomClass, module mod.z_bottom, layer 'bottomlayer_1b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgz.middle.ZMiddleClass, id=ID_ZBottomClass_24 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'bottomlayer_1a' on level 'bottom'
Module 'mod.z_bottom'
Calling mod.z_bottom/pkgz.bottom.ZBottomClass.doIt() returns:
pkgz.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgz.bottom.ZBottomClass, module mod.z_bottom, layer 'bottomlayer_1a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgz.middle.ZMiddleClass, id=ID_ZBottomClass_24 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_1' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'middlelayer_2' on level 'middle'
Module 'mod.z_middle'
Calling mod.z_middle/pkgz.middle.ZMiddleClass.doIt() returns:
pkgz.middle.ZMiddleClass, id=ID_ModuleCaller_68 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'bottomlayer_2a' on level 'bottom'
Module 'mod.z_bottom'
Calling mod.z_bottom/pkgz.bottom.ZBottomClass.doIt() returns:
pkgz.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgz.bottom.ZBottomClass, module mod.z_bottom, layer 'bottomlayer_2a' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgz.middle.ZMiddleClass, id=ID_ZBottomClass_24 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'bottomlayer_2b' on level 'bottom'
Module 'mod.z_bottom'
Calling mod.z_bottom/pkgz.bottom.ZBottomClass.doIt() returns:
pkgz.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgz.bottom.ZBottomClass, module mod.z_bottom, layer 'bottomlayer_2b' on level 'bottom' (mod.x_bottom, mod.y_bottom, mod.z_bottom) ]
plus pkgz.middle.ZMiddleClass, id=ID_ZBottomClass_24 [ class pkgz.middle.ZMiddleClass, module mod.z_middle, layer 'middlelayer_2' on level 'middle' (mod.x_middle, mod.y_middle, mod.z_middle) ]
plus pkgz.top.ZTopClass, id=ID_ZMiddleClass_24 [ class pkgz.top.ZTopClass, module mod.z_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.zreverse* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.zreverse_bottom'
Calling mod.zreverse_bottom/pkgzreverse.bottom.ZBottomClass.doIt() returns:
pkgzreverse.bottom.ZBottomClass, id=ID_ModuleCaller_68 [ class pkgzreverse.bottom.ZBottomClass, module mod.zreverse_bottom, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'toplayer' on level 'top'
Module 'mod.zreverse_middle'
Calling mod.zreverse_middle/pkgzreverse.middle.ZMiddleClass.doIt() returns:
pkgzreverse.middle.ZMiddleClass, id=ID_ModuleCaller_68 [ class pkgzreverse.middle.ZMiddleClass, module mod.zreverse_middle, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
plus pkgzreverse.bottom.ZBottomClass, id=ID_ZMiddleClass_24 [ class pkgzreverse.bottom.ZBottomClass, module mod.zreverse_bottom, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
Layer 'toplayer' on level 'top'
Module 'mod.zreverse_top'
Calling mod.zreverse_top/pkgzreverse.top.ZTopClass.doIt() returns:
pkgzreverse.top.ZTopClass, id=ID_ModuleCaller_68 [ class pkgzreverse.top.ZTopClass, module mod.zreverse_top, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
plus pkgzreverse.middle.ZMiddleClass, id=ID_ZTopClass_24 [ class pkgzreverse.middle.ZMiddleClass, module mod.zreverse_middle, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
plus pkgzreverse.bottom.ZBottomClass, id=ID_ZMiddleClass_24 [ class pkgzreverse.bottom.ZBottomClass, module mod.zreverse_bottom, layer 'toplayer' on level 'top' (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]
-------------------------------------------------------------------------------------------------------------------------------
Now calling stuff in all mod.u* modules (on any level) ...
Layer 'toplayer' on level 'top'
Module 'mod.u_bottom_middle_top'
Calling mod.u_bottom_middle_top/pkgu.U.doIt() returns:
pkgu.U, id=ID_ModuleCaller_68 [ class pkgu.U, module mod.u_bottom_middle_top, layer toplayer on level top (mod.u_bottom_middle_top, mod.x_top, mod.y_top, mod.z_top, mod.zreverse_bottom, mod.zreverse_middle, mod.zreverse_top) ]