diff options
author | Henrik Nord <[email protected]> | 2011-10-07 17:17:27 +0200 |
---|---|---|
committer | Henrik Nord <[email protected]> | 2011-10-07 17:17:32 +0200 |
commit | a5abe96590ec22779f796fc67e5afbbf99a3a922 (patch) | |
tree | b22eb07f52606bc7ab5c7339026d007784aef0a4 /system | |
parent | 00202339445daae6ed931f28f932089d5c3dd455 (diff) | |
parent | ed72d05e27fcf1d4f649014ffd7a1c2878b5b010 (diff) | |
download | otp-a5abe96590ec22779f796fc67e5afbbf99a3a922.tar.gz otp-a5abe96590ec22779f796fc67e5afbbf99a3a922.tar.bz2 otp-a5abe96590ec22779f796fc67e5afbbf99a3a922.zip |
Merge branch 'sa/callback-attr'
* sa/callback-attr:
Add callback specs into 'application' module in kernel
Add callback specs to tftp module following internet documentation
Add callback specs to inets_service module following possibly deprecated comments
Add '-callback' attributes in stdlib's behaviours
Update primary bootstrap
Update the documentation with information on the callback attribute
Automatically generate 'behaviour_info' function from '-callback' attributes
Add '-callback' attribute to language syntax
OTP-9621
Diffstat (limited to 'system')
-rw-r--r-- | system/doc/design_principles/spec_proc.xml | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/system/doc/design_principles/spec_proc.xml b/system/doc/design_principles/spec_proc.xml index f0f62891b6..a1c862e004 100644 --- a/system/doc/design_principles/spec_proc.xml +++ b/system/doc/design_principles/spec_proc.xml @@ -411,30 +411,48 @@ loop(...) -> <p>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, implement - and export the function:</p> + <p>If it is desired that the compiler should warn for missing callback + functions, as it does for the OTP behaviours, add callback attributes in the + behaviour module to describe the expected callbacks:</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 spec attributes is + supported by callback attributes.</p> + <p>Alternatively you may directly implement and export the function:</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.</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 callback 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([behaviour_info/1]). -behaviour_info(callbacks) -> - [{init,1}, - {handle_req,1}, - {terminate,0}]. +-callback init(State :: term()) -> 'ok'. +-callback handle_req(Req :: term(), State :: term()) -> {'ok', Reply :: term()}. +-callback terminate() -> 'ok'. + +%% Alternatively you may define: +%% +%% -export([behaviour_info/1]). +%% behaviour_info(callbacks) -> +%% [{init,1}, +%% {handle_req,2}, +%% {terminate,0}]. start_link(Name, Module) -> proc_lib:start_link(?MODULE, init, [self(), Name, Module]). @@ -452,7 +470,7 @@ init(Parent, Name, Module) -> -module(db). -behaviour(simple_server). --export([init/0, handle_req/1, terminate/0]). +-export([init/0, handle_req/2, terminate/0]). ...</code> </section> |