Specifying callbacks for behaviours extending gen_server

44 views
Skip to first unread message

Brett Hemes

unread,
Feb 23, 2021, 10:15:03 AM2/23/21
to erlang-q...@erlang.org

I am designing a behaviour that extends gen_server and thus I want all of gen_server’s callback specification in addition to some additional ones on top as part of the extension.  In the past I have favored using the `-callback` attribute as recommended in the documentation but then I saw someone recommend the following when extending gen_server

 

> behaviour_info(Type) -> gen_server:behaviour_info(Type).

 

I tried combining the two approaches but such is not allowed (which makes sense).  I believe my options are to append my callbacks to gen_server’s list using `behaviour_info` or to copy gen_server’s callback specifications from the OTP source.  Copy-pasting code just feels wrong...  how bad is it to use `behaviour_info` over `-callback`?  And am I taking the right approach?

 

Thanks,

Brett

Fernando Benavides

unread,
Feb 23, 2021, 10:25:56 AM2/23/21
to Brett Hemes, erlang-q...@erlang.org
What if you only specify your own callbacks and let your implementors use...

-behavior(your behavior).
-behavior(gen_server).

?
--
Sent from Gmail Mobile by Brujo Benavides

Brett Hemes

unread,
Feb 23, 2021, 11:09:32 AM2/23/21
to erlang-q...@erlang.org

I was trying out the approach of the first answer here (https://stackoverflow.com/questions/6745183/erlang-extended-gen-server).  In this approach, the extension behaviour get first crack at all of the gen_server messages and then forwards the user-module-specific stuff to the user module’s gen_server implementation.

 

Basically I have written a bunch of (tested/working) TCP client/server interaction code as a gen_server and have a bunch of other modules that add specific functionality on top but require the same TCP handshaking.  My idea was to wrap my working stuff as a behaviour but I can’t yet decide if I want to expose all of gen_server to my user modules or customize the interface.  Right now I have opted for generality and am experimenting with exposing everything but we shall see...  I am in that awkward place where I am working out my architecture while also trying to learn Erlang best practices; fun times.

 

Brett

Brett Hemes

unread,
Feb 23, 2021, 11:18:28 AM2/23/21
to erlang-q...@erlang.org

Hah; Fernando after I replied I (think I) realized what you were saying.  I now only specify my specific extensions in my behaviour using the `-callback` attribute and then include both my behaviour and gen_server in the user modules via `-behaivour`.  I think this is a good solution to my dilemma.

 

Thanks!

Brett

Leonard B

unread,
Feb 23, 2021, 11:41:10 AM2/23/21
to Brett Hemes, erlang-q...@erlang.org
Hi Brett,

This may help you out. http://davekuhlman.org/implement-a-behavior.html

Fairly simple example and concise of a behavior wrapping a gen_server

Kind regards,
Leonard
Reply all
Reply to author
Forward
0 new messages