<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">That sounds horribly complicated and I always hated corba. What problem exactly are you trying to solve here? Is it<div><br></div><div>(a) the API function simply passes its inputs verbatim to gen_server:call/2 and therefore you don't want to have to bother writing it by hand</div><div>(b) the API function is transforming its inputs before passing them to the server and you'd prefer to write this declaratively</div><div>(c) some other issue?</div><div><br></div><div>Replacing an API function in the same module as a gen_* callback function seems to me to be several orders of magnitude simpler than an IDL that magically generates 2 modules that eventually end up calling your 'backing' module somehow. Here's what I'd consider doing to remove gen_server boilerplate.</div><div><br></div><div>1. write a parse_transform that generates and exports default implementations for any missing callbacks (so that cast/info/terminate/etc are optional)</div><div>2. write a parse_transform that generates API functions (with some optional parameter transformation/mapping support) based on either some -spec records or something similar</div><div><br></div><div>You can see an example of something similar to (2) in <a href="https://github.com/hyperthunk/delegate">https://github.com/hyperthunk/delegate</a> which uses <a href="https://github.com/hyperthunk/annotations">https://github.com/hyperthunk/annotations</a>. All in all - and I speak as both an OCaml and Erlang programmer here - using compile/build time code generation feels much more natural that trying to shoehorn an IDL into the problem space.  </div><div><div><br><div><div>On 21 Mar 2012, at 11:48, Torben Hoffmann wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">
  

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  
  <div bgcolor="#FFFFFF" text="#000000">
    Hi,<br>
    <br>
    I was sitting with a co-worker - who is proficient in OCaml and lots
    of other stuff and he is now learning Erlang - and then he comes up
    with a good question on the amount of boilerplate code when
    implementing a gen_server.<br>
    <br>
    From the API functions you call out to gen_server:call/2 and on top
    of that you need to implement a handle_call/3 function clause that
    matches whatever format you used for wrapping the incoming message.<br>
    <br>
    The question was: why don't you use an IDL (Interface Definition
    Language) approach instead of writing all that code that has to
    match up in order to work?<br>
    <br>
    So the idea would be to write a my_server.idl file and from that
    generate two files:<br>
    <ul>
      <li>my_server_stub.erl</li>
      <ul>
        <li>This holds all the public APIs that clients may call.</li>
        <li>It calls my_server_skeleton as dictated by the IDL file.<br>
        </li>
      </ul>
      <li>my_server_skeleton.erl</li>
      <ul>
        <li>gets all all the calls from the my_server_stub and calls
          my_server.erl</li>
      </ul>
    </ul><p>The job then is to implement my_server.erl according to the type
      specs derived from the IDL file.<br>
    </p><p>Has anyone looked into this before?<br>
      I have tried searching for it, but since IDL is so tightly coupled
      with CORBA I didn't really find anything but the ic application
      from the Erlang/OTP distribution.<br>
    </p><p>Cheers,<br>
      Torben<br>
    </p>
    <pre class="moz-signature" cols="72">-- 
<a class="moz-txt-link-freetext" href="http://www.linkedin.com/in/torbenhoffmann">http://www.linkedin.com/in/torbenhoffmann</a></pre>
  </div>

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