Hello, *What?*
I would like to propose introducing a possibility to make a module protected/private. Functions from such module would not be visible outside of the OTP application they are defined in. *Why?* Currently, all modules included in the release are globally visible. This makes it harder to enforce correct architectural boundaries because we have no support from the compiler. We can only enforce the boundaries by being careful or by running external scripts, but both solutions fall short when the developers are under pressure or before deadlines. It would be nice if it was possible to create a module which can only be accessed from the inside of a library/application where it's defined. We have private functions, so it would be nice if we could do the same for modules which are one abstraction level higher. This would allow to clearly define a public interface for libraries/applications which would result in better design. Since one of the recent Elixir goals is to help creating maintainable software, I think this feature would be a really good step in this direction. *Issues* Proposed behaviour could be problematic due to the fact that all Elixir modules compile to Erlang modules which are all public. I came up with three possible ways to handle this: 1. Compile all modules modules as usual (resulting in public Erlang modules), but have Elixir compiler fail when the function from private/protected module is called. 2. Don't create Erlang modules from private/protected Elixir modules and "copy" the functions to public modules that use them. 3. Treat all modules are public and use mix xref task to validate this behaviour outside of the compilation step. All of the solutions have advantages and disadvantages and maybe there are some others which I didn't think of. I'll be happy to know what you think about this. Cheers, Maciej -- You received this message because you are subscribed to the Google Groups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/ba637c6c-ea48-4bb2-be1f-3758dd901ced%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
