Is anyone actually relying on the runtime aspect of -extends?<div><br></div><div>The examples above use -extends to extend another module and it happens at runtime.</div><div>It means that, if you call extending:call() it will delegate propagate at runtime to extended:call(). In erlang/otp master, this propagation happens via '$handle_undefined_function'.</div>

<div><br></div><div>However, this could also happen at compilation time. We can imagine a parse transform that handle -extends() in the following way: when you declare -extends(foo) inside a module, the parse transform will get all the functions in the module foo that are not yet defined in the module bar and generate stubs like:</div>

<div><br></div><div>    call(Arg1, Arg2) -></div><div>      foo:call(Arg1, Arg2).</div><div><div><div><br></div><div>This has the following advantages:</div><div><br></div><div>1. It is faster at runtime;</div><div>2. Doesn't require '$handle_undefined_function';</div>

<div>3. Calling bar:module_info(exports) will also reveal the functions "inherited" from foo, so it is clearer in behaviour too</div><div><br></div><div>However, it has the following disadvantages:</div><div><br>

</div><div>1. It requires module foo to be compiled before bar. I don't believe this is an issue as it is easy to tweak your Makefile or your rebar.config;</div><div>2. If the module foo is hot loaded in production, the new functions added in foo are not going to appear in bar if it is not recompiled as well</div>

<div><br></div><div>Even if someone is relying on this particular aspect (2) of extends, all they have to do is to accordingly include their updated version of bar in the upgrade recipes as well. It seems to be a fair trade-off for faster and simpler runtime semantics, unless, of course, I am missing something.</div>

<div><br></div><div><br></div><div><span style="font-size:13px"><div><span style="font-family:arial,sans-serif;font-size:13px;border-collapse:collapse"><b>José Valim</b></span></div><div><span style="font-family:arial,sans-serif;font-size:13px;border-collapse:collapse"><div>

<span style="font-family:verdana,sans-serif;font-size:x-small"><a href="http://www.plataformatec.com.br/" style="color:rgb(42,93,176)" target="_blank">www.plataformatec.com.br</a></span></div><div><span style="font-family:verdana,sans-serif;font-size:x-small">Skype: jv.ptec</span></div>

<div><span style="font-family:verdana,sans-serif;font-size:x-small">Founder and Lead Developer</span></div></span></div></span></div></div>
<br><br><div class="gmail_quote">On Tue, Jan 22, 2013 at 6:39 AM, Brujo Benavides <span dir="ltr"><<a href="mailto:elbrujohalcon@inaka.net" target="_blank">elbrujohalcon@inaka.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div style="word-wrap:break-word"><div>I can think of <a href="https://github.com/inaka/edis/blob/master/src/edis_gb_trees.erl#l9" target="_blank">this module</a> where I used it to extend some basic Erlang functionality in a similar way than what Kresten at <a href="https://github.com/basho-labs" target="_blank">basho-labs</a> did in <a href="https://github.com/basho-labs/hanoidb/blob/master/src/gb_trees_ext.erl#L3" target="_blank">hanoidb</a></div>

<div><br></div><div>I also did a quick search on github to see who else was using it for open source projects. This is what I've found:</div><div><br></div><div><span style="white-space:pre-wrap">  </span>- <a href="https://github.com/BeamJs/" target="_blank">People at Beam.js</a> use it in <a href="https://github.com/beamjs/erlv8" target="_blank">erlv8</a> for <a href="https://github.com/beamjs/erlv8/blob/master/src/erlv8_fun.erl#L5" target="_blank">their objects</a></div>

<div><span style="white-space:pre-wrap">  </span>- <a href="https://github.com/idubrov/" target="_blank">Ivan Dubrov</a> uses it in <a href="https://github.com/idubrov/siperl" target="_blank">siperl</a> for <a href="https://github.com/idubrov/siperl/blob/master/apps/sip/src/transaction/sip_transaction_client_invite.erl#L9" target="_blank">transactions</a></div>

<div><span style="white-space:pre-wrap">  </span>- <a href="https://github.com/claimstrade" target="_blank">claimstrade</a> uses it in <a href="https://github.com/claimstrade/maru" target="_blank">maru</a> for <a href="https://github.com/claimstrade/maru/blob/master/lib/maru_models/src/maru_model_users.erl#L10" target="_blank">its models</a></div>

<div>
<span style="font-family:'Lucida Grande'"><br></span><span style="font-family:'Lucida Grande'"><a href="mailto:elbrujohalcon@inaka.net" target="_blank">elbrujohalcon@inaka.net</a></span><span style="font-family:'Lucida Grande'"><br>

</span><span style="font-family:'Lucida Grande'"><br></span>
</div>
<br><div><div>On Jan 22, 2013, at 3:44 AM, Björn Gustavsson wrote:</div><br><blockquote type="cite"><div dir="ltr"><div>-extends() was mentioned when we first talked</div><div>about removing parameterized modules, so we</div>

<div>assumed that we needed to emulate -extends()</div><div>as well as parameterized modules.</div>
<div><br></div><div>It seems to be a good time to ask the question:</div><div><br></div><div>Is -extends() used by real projects? Do we really</div><div>need to emulate it?</div><div><br>
</div><div>BTW, -extends() is described here:</div><div><br></div><div>  <a href="http://www.erlang.se/euc/07/papers/1700Carlsson.pdf" target="_blank">http://www.erlang.se/euc/07/papers/1700Carlsson.pdf</a><span class="HOEnZb"><font color="#888888"><br>

</font></span></div><span class="HOEnZb"><font color="#888888"><div>
<br></div>-- <br>Björn Gustavsson, Erlang/OTP, Ericsson AB
</font></span></div><span class="HOEnZb"><font color="#888888">
_______________________________________________<br>erlang-questions mailing list<br><a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br><a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>

</font></span></blockquote></div><br></div><br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br></div>