From 146260727638e8a477aeda7828364ce45dc506a0 Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Tue, 15 Apr 2014 09:38:41 +0200
Subject: Introduce the attribute -optional_callbacks in the context of
 behaviours

---
 system/doc/design_principles/spec_proc.xml | 76 ++++++++++++++++++++++--------
 1 file changed, 56 insertions(+), 20 deletions(-)

(limited to 'system/doc')

diff --git a/system/doc/design_principles/spec_proc.xml b/system/doc/design_principles/spec_proc.xml
index e4fb5fdca7..e849388a38 100644
--- a/system/doc/design_principles/spec_proc.xml
+++ b/system/doc/design_principles/spec_proc.xml
@@ -431,43 +431,79 @@ loop(...) ->
 
   <section>
     <title>User-Defined Behaviours</title>
-    <p><marker id="behaviours"/>To implement a user-defined behaviour, write code similar to
-      code for a special process but calling functions in a callback
-      module for handling specific tasks.</p>
-    <p>If it is desired that the compiler should warn for missing callback
-    functions, as it does for the OTP behaviours, add <c>-callback</c> attributes in the
-    behaviour module to describe the expected callbacks:</p>
+
+    <p><marker id="behaviours"/>To implement a user-defined behaviour,
+      write code similar to code for a special process but calling
+      functions in a callback module for handling specific tasks.</p>
+    <p>If it is desired that the compiler should warn for missing
+      callback functions, as it does for the OTP behaviours, add
+      <c>-callback</c> attributes in the behaviour module to describe
+      the expected callback functions:</p>
+
     <code type="none">
 -callback Name1(Arg1_1, Arg1_2, ..., Arg1_N1) -> Res1.
 -callback Name2(Arg2_1, Arg2_2, ..., Arg2_N2) -> Res2.
 ...
 -callback NameM(ArgM_1, ArgM_2, ..., ArgM_NM) -> ResM.</code>
-    <p>where <c>NameX</c> are the names of the expected callbacks and
-    <c>ArgX_Y</c>, <c>ResX</c> are types as they are described in Specifications
-    for functions in <seealso marker="../reference_manual/typespec">Types and
-    Function Specifications</seealso>. The whole syntax of <c>-spec</c> attribute is
-    supported by <c>-callback</c> attribute.</p>
-    <p>Alternatively you may directly implement and export the function:</p>
+
+    <p>where each <c>Name</c> is the name of a callback function and
+      <c>Arg</c> and <c>Res</c> are types as described in
+      Specifications for functions in <seealso
+      marker="../reference_manual/typespec">Types and Function
+      Specifications</seealso>. The whole syntax of the
+      <c>-spec</c> attribute is supported by <c>-callback</c>
+      attribute.</p>
+    <p>Callback functions that are optional for the user of the
+      behaviour to implement are specified by use of the
+      <c>-optional_callbacks</c> attribute:</p>
+
+<code type="none">
+-optional_callbacks([OptName1/OptArity1, ..., OptNameK/OptArityK]).</code>
+
+    <p>where each <c>OptName/OptArity</c> specifies the name and arity
+      of a callback function. Note that the <c>-optional_callbacks</c>
+      attribute is to be used together with the <c>-callback</c>
+      attribute; it cannot be combined with the
+      <c>behaviour_info()</c> function described below.</p>
+    <p>Tools that need to know about optional callback functions can
+      call <c>Behaviour:behaviour_info(optional_callbacks)</c> to get
+      a list of all optional callback functions.</p>
+
+    <note><p>We recommend using the <c>-callback</c> attribute rather
+      than the <c>behaviour_info()</c> function. The reason is that
+      the extra type information can be used by tools to produce
+      documentation or find discrepancies.</p></note>
+
+    <p>As an alternative to the <c>-callback</c> and
+      <c>-optional_callbacks</c> attributes you may directly implement
+      and export <c>behaviour_info()</c>:</p>
+
     <code type="none">
 behaviour_info(callbacks) ->
     [{Name1, Arity1},...,{NameN, ArityN}].</code>
-    <p>where each <c>{Name, Arity}</c> specifies the name and arity of a callback
-    function. This function is otherwise automatically generated by the compiler
-    using the <c>-callback</c> attributes.</p>
+
+    <p>where each <c>{Name, Arity}</c> specifies the name and arity of
+      a callback function. This function is otherwise automatically
+      generated by the compiler using the <c>-callback</c>
+      attributes.</p>
     <p>When the compiler encounters the module attribute
-    <c>-behaviour(Behaviour).</c> in a module <c>Mod</c>, it will call
-    <c>Behaviour:behaviour_info(callbacks)</c> and compare the result with the
-    set of functions actually exported from <c>Mod</c>, and issue a warning if
-    any callback function is missing.</p>
+      <c>-behaviour(Behaviour).</c> in a module <c>Mod</c>, it will
+      call <c>Behaviour:behaviour_info(callbacks)</c> and compare the
+      result with the set of functions actually exported from
+      <c>Mod</c>, and issue a warning if any callback function is
+      missing.</p>
     <p>Example:</p>
     <code type="none">
 %% User-defined behaviour module
 -module(simple_server).
--export([start_link/2,...]).
+-export([start_link/2, init/3, ...]).
 
 -callback init(State :: term()) -> 'ok'.
 -callback handle_req(Req :: term(), State :: term()) -> {'ok', Reply :: term()}.
 -callback terminate() -> 'ok'.
+-callback format_state(State :: term()) -> term().
+
+-optional_callbacks([format_state/1]).
 
 %% Alternatively you may define:
 %%
-- 
cgit v1.2.3