最好的、最模块化的方法是在一个模块(例如)中实现一个新的行为并从那里gen_ext_server
包装这个行为。gen_server
首先,确保您的行为与以下内容相同gen_server
:
-module(gen_ext_server).
-behavior(gen_server).
% Exports...
behaviour_info(Type) -> gen_server:behaviour_info(Type).
实现所需的所有回调gen_server
,将实现您的行为的回调模块的名称保留在您的状态中:
init([Mod|ExtraArgs]) ->
% ...
ModState = Mod:init(ExtraArgs),
#state{mod = Mod, mod_state = ModState, internal = [...]}
然后,在每个gen_server
回调中,实现您的行为,然后在需要时调用回调模块:
handle_call(internal, _From, State) ->
% Do internal stuff...
{reply, ok, State};
handle_call(Normal, From, State = #state{mod = Mod, mod_state = ModState}) ->
case Mod:handle_call(Normal, From, ModState) of
{reply, Reply, NewState} ->
{reply, Reply, #state{mod_state = NewState};
... ->
...
end.
handle_cast/2
为,handle_info/2
等实现类似的功能terminate/1
。