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
-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