Example example_layer-hierarchy

Part of the full Java 9 Jigsaw modules example suite.

Authors

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 toplayer on level top (parent is the boot layer)

    • layer middlelayer_1 on level middle (parent is toplayer)

      • layer bottomlayer_1a on level bottom (parent is middlelayer_1)

      • layer bottomlayer_1b on level bottom (parent is middlelayer_1)

    • layer middlelayer_2` on level middle (parent is toplayer)

      • layer bottomlayer_2a on level bottom (parent is middlelayer_2)

      • layer bottomlayer_2b on level bottom (parent is middlelayer_2)

Modules in this example

layer hierarchy.drawio
  • mod.layer contains a layer tree data structure (built up when reading a JSON file like layers_triple_hierarchy.json)

  • mod.main contains the main class which

    1. builts up the layers and

    2. 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 Y example except that the Z* 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 Z example 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 requires declarations in module-info.java for explicit modules

  • For automatic modules (JARs without module-info.java on 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.main declares requires javax.json to read the JSON configuration file

  • javax.json is placed in amlib/ as an automatic module (JAR without module-info.java)

  • Because javax.json is automatic, it automatically reads all modules on the module-path, including:

    • mod.x_bottom (exports pkgx)

    • mod.x_middle (exports pkgx)

    • mod.x_top (exports pkgx)

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.json reads three modules that all export the same package pkgx

  • 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 pkgx can exist in multiple layers without conflict

  • javax.json is 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 …​

  1. The example shows how a layer hierarchy can be built up (see mod.main/pkgmain.LayerBuilder and mod.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).

  2. The example shows also how modules in different layers can interact with each other via derivation and delegation (see section "Modules …​").

  3. 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 package pkgx

  • At runtime, this works fine because modules are loaded into different layers (layer isolation)

  • At compile time, the automatic module javax.json automatically reads all modules on the module-path

  • This creates a compile-time conflict: javax.json would 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 (using ln -sfn)

Windows

Creates directory mlib/ and copies JARs from target/

The Windows approach avoids AccessDeniedException issues when Java’s ModuleLayer API traverses symlinks.

A committed symlink m4/mlib → target exists in Git for convenience on Unix systems. On Windows, this symlink is replaced with a directory and copied JARs at runtime by run.sh. Both approaches redirect the hardcoded mlib path to Maven-built JARs without modifying shared source code.

Running the Maven 4 Version

cd m4/
./compile.sh  # Hybrid: manual javac for mod.x_*, Maven for others
./run.sh      # Run the layer hierarchy example
./verify.sh   # Verify output matches expected result
./clean.sh    # Remove build artifacts

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) ]