-module(clock). -export([start/1, stop/0, join/0, leave/0]). start(Period) -> Pid = spawn(fun () -> loop(Period, subscription:start()) end), register(clock, Pid), {ok, Pid}. join() -> subscription:subscribe(get_pid()), ok. leave() -> subscription:unsubscribe(get_pid()), ok. stop() -> Pid = whereis(clock), unregister(clock), Pid ! {quit}, ok. get_pid() -> clock ! {manager, self()}, receive {clock_manager, Manager} -> Manager after 500 -> exit({clock, manager_down}) end. loop(Period, SubMan) -> receive {quit} -> subscription:stop(SubMan); {manager, Whom} -> Whom ! {clock_manager, SubMan}, loop(Period, SubMan) after Period -> subscription:send(SubMan, tick), loop(Period, SubMan) end.