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.

Reply via email to