<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Hi fellows,</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">       </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 class="Apple-tab-span" style="white-space:pre">    </span>And then I found myself in the following situation:</div><div><br></div><div><font class="Apple-style-span" 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 class="Apple-style-span" face="Monaco">------------------------------------------</font></div><div><br></div><div><font class="Apple-style-span" 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 class="Apple-style-span" style="font-family: Monaco; font-size: 11px; ">a_value() </span><span class="Apple-style-span" style="font-family: Monaco; font-size: 11px; "><span style="color: #3d00fd">-></span></span><span class="Apple-style-span" style="font-family: Monaco; font-size: 11px; "> child_value.</span></div><div><font class="Apple-style-span" face="Monaco">------------------------------------------</font></div></div><div><font class="Apple-style-span" face="Monaco"><br></font></div><div><div><font class="Apple-style-span" 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 class="Apple-style-span" 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 class="Apple-style-span" 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 class="Apple-style-span" 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 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>
</div>
<br></body></html>