I also commonly come across modules that are listed in ExDoc but turn out to only be part of the implementation of the 'main' module of the library, as well as the inverse, where I am myself creating a library and I'd want to split stuff up in multiple modules but end up not doing it because I don't want to confuse the user of the library with the extra modules.
More importantly than the second point though, is the fact that I actually do want to have documentation (including possibly doctests) for my 'private' modules' public functions (So functions that are used by other modules in my library). This to:
1. Inform my future self and other contributors to the open source project about design choices made in the implementation of certain functions.
2. Sometimes, test these functions. (There is some arguing about this; some people say that testing should only occur at the most external layer of your library, but I concur because often, libraries end up being nested (without it making sense to split stuff into multiple physical libraries)).
I really would like to use the markdown-syntax for this, and also to generate ExDoc pages that include this information (as well as showing it within IEx). Of course, with a disclaimer that this function is part of a 'private' module and should not be used by consumers of the library but only by the library itself.
@Christopher Keele's trick to still use Markdown-syntax is interesting, but since it is not actually compiled to any documentation I don't think it is particularly useful.
Personally, I do think that having a way to annotate modules as protected or private (Possibly, protected is the more accurate name for this functionality?) that would:
- Generate disclaimers on top of documentation, possibly hiding the actual documentation behind a 'spoiler'-like tag to make sure that people don't glance over the disclaimer.
- Show references to the modules in a different color (i.e. 'faded out') in ExDoc (and possibly IEx) to make sure that people see that these modules are uninteresting for the outside world.
This would already protect against 95% of the 'bad use'. In the end, if a user wants to do something what is bad for them and we have informed them that it is bad, it is their own choice, after all.
And yes, maybe we could also have the compiler throw warnings when a user does decide to depend on an 'internal' function. But I think that is all that is needed.
~Wiebe-Marten Wijnja/Qqwy