By default, any function specified in a -callback
directive in a behaviour module must be exported by a module that implements that behaviour. Otherwise, you'll get a compiler warning.
Sometimes, you want a callback function to be optional: the behaviour would use it if present and exported, and otherwise fall back on a default implementation. To do that, write the -callback
directive as usual, and then list the callback function in an -optional_callbacks
directive:
-callback bar() -> ok.
-optional_callbacks([bar/0]).
If the module exports bar/0
, Dialyzer will still check the type spec, but if the function is absent, you won't get a compiler warning.
In Erlang/OTP itself, this is done for the format_status
callback function in the gen_server
, gen_fsm
and gen_event
behaviours.