% This is the behaviour definition for a generic object. -module(gen_object). -export([new/2, delete/1, send/3]). -callback initialise(Args :: [any()]) -> State :: any(). -callback handle_message(Msg :: atom(), Args :: [any()], State :: any()) -> {Response :: any(), New_State :: any()}. send(Obj, Msg, Args) -> Obj ! {self(), Msg, Args}, receive Response -> Response end. new(CBM, Args) -> State = apply(CBM, initialise, [Args]), spawn(fun() -> loop(CBM, State) end). loop(CBM, State) -> receive gen_object__bif__exit -> ok; {From, Msg, Args} -> {Resp, New_State} = apply(CBM, handle_message, [Msg, Args, State]), From ! Resp, loop(CBM, New_State) end. delete(Obj) -> Obj ! gen_object__bif__exit.