It is clearly a "data level" operation from the perspective of the dir- and joinnodes, whose own functions and stuff are the "meta level".
The confusion here is that when one cease to use . then the internal workings of the resolver machinery aren't hidden anymore. If one were to rewrite the dirnode stuff completely so that those objects actually _are_ the module objects then it'd be another matter and I'd agree -> should work on them.
But that's not the case currently, so what we're left with is that the join- and dirnodes do show and one has to be aware of them if one starts doing stuff like this. In other words, users on this level must be aware that modules can be join- or dirnode objects and that there accordingly is a distinction between "data" and "meta" levels when using them.
Another example is that inheriting a directory module or a joined module doesn't do what one want at all.