_"Modules are organised in a single and flat namespace and therefore module names must be chosen with some care to avoid conflicts."_
One could use the convention adopted by Java which names packages according to the reversed domain name of the issuing organization, for example
com.example.megacorp, which arbitary extensions.
In the Java world, this does not indicate a hierarchy, the dot-path is just a name and package organization is "flat". However, the files of package must be organized hierarchically on-disk, mirroring the package's dot-path.
The Module name can be any atom, so this should work, but one needs to enclose the Module name into single quotes or the dot will be interpreted as a dict =.= operator
:-module('com.example.megacorp.hq.upperfloor', [make_money/2]). make_money("Make more money!", "Yes, sir").