<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Ha! Super tricky, but I like your solution and it is similar to the way I would implement -extends: I would include all non-overridden parent functions in child.erl at compile time, but I get your point about code-reloading, I haven't thought about that.</div><div><br></div><div>Thanks!</div><br><div><div>On 23/12/2011, at 12:11, Fred Hebert wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>The inheritance you see, is, as far as I know, just about redirecting calls.  Let's say I have 2 modules, parent and child, where child extends parent.</div><div><br></div><div>What happens is that when a call to child:some_function() fails because 'some_function/0' doesn't exist in child, the function is directly called as 'parent:some_function()' instead. Because of this, the macro cannot respect inheritance. It's simply a hack. The macro is a compile-time item while the -extends dispatching is a run-time mechanism.</div>

<div><br></div><div>The feature you want would also have complex implications when it comes to code reloading: what if I change 'parent' and recompile it, reload it, without changing the child module?</div><div><br>

</div><div>In general, I would advise against using -extends except when you know you really need it (i.e.: reimplementing a new AccessMod for Mnesia, where you have dozens and dozens of callbacks and you might want to only change one of them, while keeping the rest intact).</div>

<div><br></div><div>What you want to do could instead be accomplished with a .hrl file. Just save</div><div><br></div><div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">

-export([run/<span style="color:#736cc0">0</span>, module/<span style="color:#736cc0">0</span>, a_value/<span style="color:#736cc0">0</span>]).</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px">

<br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">run() <span style="color:#3d00fd">-></span></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">

  io:format(<span style="color:#c6a1a1">"Module: ~p~nA Value: ~p~n"</span>, [module(), a_value()]).</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px">

<br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">module() <span style="color:#3d00fd">-></span> <span style="color:#76adaf">?MODULE</span>.</div>

<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px"><br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">

a_value() <span style="color:#3d00fd">-></span> parent_value</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"><br></div></div><div>And then include that .hrl file in any module you want to have this (-include("my_file.hrl").). The ?MODULE macro will be supported fine in that place, and you will avoid all the issues of having local vs. remote calls. This is much easier and a lot less surprising for people using your code.</div>

<div><br></div><div><br></div><div class="gmail_quote">On Fri, Dec 23, 2011 at 9:17 AM, Fernando "Brujo" Benavides <span dir="ltr"><<a href="mailto:fernando.benavides@inakanetworks.com">fernando.benavides@inakanetworks.com</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>Hi fellows,</div><div><br></div><div><span style="white-space:pre-wrap">     </span>Today I found myself writing a couple of modules with shared behavior (and what I mean by that is that except for an all/0 function with a different implementation in each module, the rest of their code is copy-pasted in each one of them). So, I said to myself: "This is a great place to use -extends!"</div>

<div><br></div><div><span style="white-space:pre-wrap"> </span>And then I found myself in the following situation:</div><div><br></div><div><font face="Monaco">--------------- parent.erl ---------------</font></div><div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
-module(parent).</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px"><br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">

-export([run/<span style="color:#736cc0">0</span>, module/<span style="color:#736cc0">0</span>, a_value/<span style="color:#736cc0">0</span>]).</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px">

<br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">run() <span style="color:#3d00fd">-></span></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">

  io:format(<span style="color:#c6a1a1">"Module: ~p~nA Value: ~p~n"</span>, [module(), a_value()]).</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px">

<br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">module() <span style="color:#3d00fd">-></span> <span style="color:#76adaf">?MODULE</span>.</div>

<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px"><br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">

a_value() <span style="color:#3d00fd">-></span> parent_value</div></div><div><font face="Monaco">------------------------------------------</font></div><div><br></div><div><font face="Monaco">----------------- child.erl --------------</font></div>

<div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">-module(child).</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px">

<br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">-extends(parent).</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px">

<br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">-export([module/<span style="color:#736cc0">0</span>, a_value/<span style="color:#736cc0">0</span>]).</div>

<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px"><br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">

module() <span style="color:#3d00fd">-></span> <span style="color:#76adaf">?MODULE</span>.</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px">

<br></div><div><span style="font-family:Monaco;font-size:11px">a_value() </span><span style="font-family:Monaco;font-size:11px"><span style="color:#3d00fd">-></span></span><span style="font-family:Monaco;font-size:11px"> child_value.</span></div>

<div><font face="Monaco">------------------------------------------</font></div></div><div><font face="Monaco"><br></font></div><div><div><font face="Monaco">----------------- console ----------------</font></div><div><div>

2> parent:run().</div><div>Module: parent</div><div>A Value: parent_value</div><div>ok</div><div>3> child:run().</div><div>Module: parent</div><div>A Value: parent_value</div><div>ok</div><div><font face="Monaco">------------------------------------------</font></div>

</div></div><div><br></div><div>It would've been a lot nicer to see different results, as follows...</div><div><br></div><div><div><font face="Monaco">----------------- console ----------------</font></div><div><div>
2> parent:run().</div>
<div>Module: parent</div><div>A Value: parent_value</div><div>ok</div><div>3> child:run().</div><div>Module: child</div><div>A Value: child_value</div><div>ok</div><div><font face="Monaco">------------------------------------------</font></div>

</div></div><div><br></div><div>In other words, I would like the ?MODULE macro to somehow respect inheritance (I know it may be difficult but I don't think it's impossible, right?) and/or functions to have a more OOP-like behavior, where if called from child module any overridden function that's called is used in its overridden version.</div>

<div><br></div><div>Just a suggestion :)</div><div><br></div><div>Cheers!</div><div>
<div><font face="Verdana"><b>____________________________</b></font></div><span class="HOEnZb"><font color="#888888"><div><font face="Verdana"><b>Fernando "Brujo" Benavides</b></font></div><div><font face="Verdana"><a href="mailto:fernando.benavides@inakanetworks.com" target="_blank">fernando.benavides@inakanetworks.com</a></font></div>


</font></span></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>
</blockquote></div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div><font class="Apple-style-span" face="Verdana"><b>____________________________</b></font></div><div><font class="Apple-style-span" face="Verdana"><b>Fernando "Brujo" Benavides</b></font></div><div><font class="Apple-style-span" face="Verdana"><a href="mailto:fernando.benavides@inakanetworks.com">fernando.benavides@inakanetworks.com</a></font></div></span>
</div>
<br></body></html>