<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="111826" data-post-id="111826">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="josevalim" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/120/1787_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  josevalim
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Elixir</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="tmbb" data-post="130" data-topic="19374">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/t/77aa72/48.png" class="avatar"> tmbb:</div>
<blockquote>
<p>I’ve been thinking and maybe my main objection is that any package that used <code>defmodulep</code> will be instantly impossible to use in older Elixir versions.</p>
</blockquote>
</aside>
<p>I don’t think this is a big concern because that’s what happens on every new Elixir feature. <code>with</code>, DynamicSupervisor, new child specs, the new struct inspect in v1.8, etc. The author of a library needs to decide which versions they are support and decide to use an Elixir feature accordingly.</p>
<aside class="quote no-group" data-username="tmbb" data-post="130" data-topic="19374">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/t/77aa72/48.png" class="avatar"> tmbb:</div>
<blockquote>
<p>An <code>aliasp</code> macro would play well with the idea that private modules should start with <code>:"Elixirp."</code> and would avoid the cost of <code>require</code> ing the module (because <code>alias</code> calls can be made in parallel).</p>
</blockquote>
</aside>
<p>Yup, yup! If we go with a separate command, <code>aliasp</code> is enough and we don’t even need <code>requirep</code>. The verification can be done in parallel too if we defer it to until the module is compiled (i.e. in an <code>after_compile</code> callback). I am still worried about adding yet another “instruction” though. <img src="https://forum.elixirforum.com/images/emoji/apple/frowning.png?v=15" title=":frowning:" class="emoji" alt=":frowning:" loading="lazy" width="20" height="20"> People already confuse use, require, import and alias.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="111826" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/proposal-private-modules-general-discussion/19374/132">Post #131</a>
	                </div>
	            </div>
              <div id="likers-container-111826" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="111826"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #131"></div>
  </section>
</div>
    <div class="postbit" id="111827" data-post-id="111827">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="josevalim" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/120/1787_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  josevalim
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Elixir</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks <a class="mention" href="/u/gregvaughn" rel="nofollow">@gregvaughn</a>! One last question, if you have the time. Given everything you said, how does proposal A fair? Since it doesn’t really introduce an operational cost, the implementation is simpler, and it can improve the communication between teams?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="111827" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/proposal-private-modules-general-discussion/19374/133">Post #132</a>
	                </div>
	            </div>
              <div id="likers-container-111827" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="111827"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #132"></div>
  </section>
</div>
    <div class="postbit" id="111830" data-post-id="111830">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="tmbb" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  tmbb
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote group-livebook_core_team" data-username="josevalim" data-post="132" data-topic="19374">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/48/1787_2.png" class="avatar"> josevalim:</div>
<blockquote>
<p>The verification can be done in parallel too if we defer it to until the module is compiled (i.e. in an <code>after_compile</code> callback).</p>
</blockquote>
</aside>
<p>You are way ahead of what I was thinking xD I was thinking of raising the error when a function from that module was used. Raising the error at compile time is pretty cool, and if it’s possible I’m in.</p>
<aside class="quote group-livebook_core_team" data-username="josevalim" data-post="132" data-topic="19374">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/48/1787_2.png" class="avatar"> josevalim:</div>
<blockquote>
<p>I am still worried about adding yet another “instruction” though. <img src="https://forum.elixirforum.com/images/emoji/apple/frowning.png?v=15" title=":frowning:" class="emoji" alt=":frowning:" loading="lazy" width="20" height="20"> People already confuse use, require, import and alias.</p>
</blockquote>
</aside>
<p>I’m the first to admit that this is very confusing. But adding <code>aliasp</code>, <code>requirep</code> or even <code>importp</code> and <code>usep</code> wouldn’t increase complexity, because anyonw who uses the first four immediately understands how to use private versions. They’re just the same but for a private module.</p>
<p>The original confusion comes from the large number of concepts you need to understand, some of which require the user to be compfortable with macros and (even worse!) the implementation details of the Elixir compiler. For example:</p>
<ul>
<li>
<p>to understand <code>use</code>, you need to know what macros are and how to define them. Otherwise, use is complete magic. It doesn’t help that most educational materials tell you to <code>use GenServer</code>, and Bam! you have a genserver. When you understand how macros work, you understand that the <code>use</code> macro is defining a bunch of overrideable functions in your module and implementing the <code>GenServer</code> behaviour. But notice that there are a bunch of concepts you need to understand (macors, overrideable defs, behaviours, etc.)</p>
</li>
<li>
<p>to understand the differences between <code>require</code> and <code>alias</code>, you need to know that the Elixir compiler is a parallel compiler. And that is because it is so slow that it’s worth it to hack the default Erlang error handling mechanisms just to improve compilation speed. So you have a distinction which seems arbitrary until you understand the reasons behind it. If the elixir compiler was blazing fast (which unfortunately, it isn’r for a number of reasons), you could require everything and alias nothing. Ultimately, <code>alias</code> is just a faster <code>require</code> which can’t export macros because they haven’t been compiled yet.</p>
</li>
<li>
<p>To understand <code>import</code>, you must again understand that the Elixir has a prallel compiler and you can’t assume that the compiler for one file knows what exactly has been defined in another file, unless you force an ordering.</p>
</li>
</ul>
<p>I’m totally unaware of Elixir’s early history, and these decisions probably predate the parallel compiler, but these are the ways I personally make sense of the <code>use</code>, <code>require</code>, <code>import</code> and <code>alias</code>. If I were designing the language from scratch, I’d have only <code>import X</code> and <code>import X, qualified: true</code> or something like that. And <code>use</code>, of couse (actually, I’d have never come up with <code>use</code>, which is an amazing feature to save typing). But ultimately, <code>use X</code> is just <code>import X, qualified: true; X.some_magic()</code>.</p>
<p>This complexity makes people confused in the beginning, of course, but it’s pretty simple when you think of it as a trick to improve compilation speed.</p>
<p>EDIT: This goes offtopic by a wide margin; the main point is that what whoever understands <code>user</code>, … <code>require</code>, will also understand the <code>p</code> versions without problem, because they are just private versions of the four commands.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="111830" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/proposal-private-modules-general-discussion/19374/134">Post #133</a>
	                </div>
	            </div>
              <div id="likers-container-111830" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="111830"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #133"></div>
  </section>
</div>
    <div class="postbit" id="111831" data-post-id="111831">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="dimitarvp" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dimitarvp/120/38664_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  dimitarvp
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="gregvaughn" data-post="131" data-topic="19374">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/gregvaughn/48/954_2.png" class="avatar"> gregvaughn:</div>
<blockquote>
<p>or what if OTP introduces a low level feature in the future that would give us an even better way to communicate privacy?</p>
</blockquote>
</aside>
<p>Interesting point.</p>
<p>Perhaps before private modules are introduced in Elixir, the core Elixir maintainers should touch base with the Erlang/OTP team first? Maybe they have something in mind as well.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="111831" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/proposal-private-modules-general-discussion/19374/135">Post #134</a>
	                </div>
	            </div>
              <div id="likers-container-111831" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="111831"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #134"></div>
  </section>
</div>
    <div class="postbit" id="111832" data-post-id="111832">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="tmbb" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  tmbb
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote group-livebook_core_team" data-username="josevalim" data-post="132" data-topic="19374">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/48/1787_2.png" class="avatar"> josevalim:</div>
<blockquote>
<p><code>aliasp</code> is enough and we don’t even need <code>requirep</code> .</p>
</blockquote>
</aside>
<p>You need <code>requirep</code> if you want to use macros from a private module of course. And if you’re going to add both <code>aliasp</code> and <code>requirep</code>, you might as well add <code>usep</code> and <code>importp</code> for completeness.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="111832" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/proposal-private-modules-general-discussion/19374/136">Post #135</a>
	                </div>
	            </div>
              <div id="likers-container-111832" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="111832"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #135"></div>
  </section>
</div>
    <div class="postbit" id="111833" data-post-id="111833">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="gregvaughn" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/gregvaughn/120/954_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  gregvaughn
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote group-livebook_core_team" data-username="josevalim" data-post="133" data-topic="19374" data-full="true">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/48/1787_2.png" class="avatar"> josevalim:</div>
<blockquote>
<p>Thanks <a class="mention" href="/u/gregvaughn" rel="nofollow">@gregvaughn</a>! One last question, if you have the time. Given everything you said, how does proposal A fair? Since it doesn’t really introduce an operational cost, the implementation is simpler, and it can improve the communication between teams?</p>
</blockquote>
</aside>
<p>Yes, proposal A is great to me.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="111833" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/proposal-private-modules-general-discussion/19374/137">Post #136</a>
	                </div>
	            </div>
              <div id="likers-container-111833" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="111833"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #136"></div>
  </section>
</div>
    <div class="postbit" id="111840" data-post-id="111840">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="JEG2" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/JEG2/120/936_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  JEG2
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Designing Elixir Systems with OTP</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/gregvaughn" rel="nofollow">@gregvaughn</a> has won me over.  I’m changing my vote to A.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="111840" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/proposal-private-modules-general-discussion/19374/138">Post #137</a>
	                </div>
	            </div>
              <div id="likers-container-111840" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="111840"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #137"></div>
  </section>
</div>
    <div class="postbit" id="111848" data-post-id="111848">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="gregvaughn" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/gregvaughn/120/954_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  gregvaughn
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="gregvaughn" data-post="131" data-topic="19374">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/gregvaughn/48/954_2.png" class="avatar"> gregvaughn:</div>
<blockquote>
<p>I have no illusions that I will change anyone’s mind.</p>
</blockquote>
</aside>
<aside class="quote no-group" data-username="JEG2" data-post="138" data-topic="19374" data-full="true">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jeg2/48/936_2.png" class="avatar"> JEG2:</div>
<blockquote>
<p><a class="mention" href="/u/gregvaughn" rel="nofollow">@gregvaughn</a> has won me over. I’m changing my vote to A.</p>
</blockquote>
</aside>
<p>Oh no! You shattered my illusions! <img src="https://forum.elixirforum.com/images/emoji/apple/grin.png?v=15" title=":grin:" class="emoji" alt=":grin:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="111848" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/proposal-private-modules-general-discussion/19374/139">Post #138</a>
	                </div>
	            </div>
              <div id="likers-container-111848" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="111848"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #138"></div>
  </section>
</div>
    <div class="postbit" id="111849" data-post-id="111849">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="josevalim" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/120/1787_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  josevalim
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Elixir</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="tmbb" data-post="134" data-topic="19374">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/t/77aa72/48.png" class="avatar"> tmbb:</div>
<blockquote>
<p>I’m totally unaware of Elixir’s early history, and these decisions probably predate the parallel compiler, but these are the ways I personally make sense of the <code>use</code> , <code>require</code> , <code>import</code> and <code>alias</code> .</p>
</blockquote>
</aside>
<p>They do. I don’t want to side-track the discussion but they do predate it as they do four distinct things. We had countless discussions to unify this and the consensus was always that, even if we can hide behind a single API (like Python), they still do distinct things, and the different things are the source of confusion, not the API (as we see similar issues in Python).</p>
<aside class="quote no-group" data-username="tmbb" data-post="136" data-topic="19374">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/t/77aa72/48.png" class="avatar"> tmbb:</div>
<blockquote>
<p>You need <code>requirep</code> if you want to use macros from a private module of course. And if you’re going to add both <code>aliasp</code> and <code>requirep</code> , you might as well add <code>usep</code> and <code>importp</code> for completeness.</p>
</blockquote>
</aside>
<p>You could alias first and then do the rest using regular APIs. In this sense, maybe having a separate thing like <code>expose</code> would be better. Unsure. Your point is also valid.</p>
<aside class="quote no-group" data-username="gregvaughn" data-post="137" data-topic="19374">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/gregvaughn/48/954_2.png" class="avatar"> gregvaughn:</div>
<blockquote>
<p>Yes, proposal A is great to me.</p>
</blockquote>
</aside>
<p>Thanks!</p>
<aside class="quote no-group quote-modified" data-username="dimitarvp" data-post="135" data-topic="19374">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dimitarvp/48/38664_2.png" class="avatar"> dimitarvp:</div>
<blockquote>
<blockquote>
<p>or what if OTP introduces a low level feature in the future that would give us an even better way to communicate privacy?</p>
</blockquote>
</blockquote>
</aside>
<p>To be very honest, this is extremely unlikely. This change is far com a consensus here and the Erlang community is even more conservative than us. There is also an old-ish proposal for a similar feature for Erlang as EEP 5.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="111849" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/proposal-private-modules-general-discussion/19374/140">Post #139</a>
	                </div>
	            </div>
              <div id="likers-container-111849" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="111849"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #139"></div>
  </section>
</div>
    <div class="postbit" id="111850" data-post-id="111850">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="tmbb" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  tmbb
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote group-livebook_core_team" data-username="josevalim" data-post="140" data-topic="19374">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/48/1787_2.png" class="avatar"> josevalim:</div>
<blockquote>
<p>You could alias first and then do the rest using regular APIs.</p>
</blockquote>
</aside>
<p>Hm… Interesting, I didn’t think of it, but it’s a pretty good idea.</p>
<aside class="quote group-livebook_core_team" data-username="josevalim" data-post="140" data-topic="19374">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/48/1787_2.png" class="avatar"> josevalim:</div>
<blockquote>
<p>In this sense, maybe having a separate thing like <code>expose</code> would be better.</p>
</blockquote>
</aside>
<p>In this case, <code>expose</code> would be great! you call <code>expose</code> to expose your private module and then do whatever you want with it. You can require it, import it or use it <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p>
<p>I think you should either add <code>export</code> and nothing else OR add all four <code>aliasp</code>, <code>requirep</code>, <code>importp</code> and <code>usep</code>. Both are interesting extremes. The former adds a new concept, which is to expose a normally hidden module. The you can do whatever you want with that module. The latter adds a more succint API to work with private modules as if they were public.</p>
<p>After your remark I prefer <code>expose</code>.</p>
<p>EDIT: and you could probably perform all kinds of async deferred error checking on <code>expose</code> if you want, as you were proposing with <code>aliasp</code></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="111850" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/proposal-private-modules-general-discussion/19374/141">Post #140</a>
	                </div>
	            </div>
              <div id="likers-container-111850" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="111850"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #140"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/19374/load_more?page=15">Load more posts (17 remaining)</a>
</div></template></turbo-stream>