defmodule LineMessage.Event do use GenServer def start_link do GenServer.start_link(__MODULE__, [], name: __MODULE__) end def on(event_type, module, func) do apply_func = fn -> apply(module, func, []) end GenServer.cast(__MODULE__, {:on, event_type, module, apply_func}) end def on(event_type, func) do GenServer.cast(__MODULE__, {:on, event_type, func}) end def notify(event) do GenServer.cast(__MODULE__, {:notify, event}) end def listeners_list do GenServer.call(__MODULE__, :listeners) end def handle_cast({:on, event_type, func}, listeners) do {:noreply, [ {event_type, func} | listeners ]} end def handle_cast({:notify, event}, listeners) do Enum.each(listeners, fn {event_type, func} -> if event_type == event.type, do: func.(event) end) {:noreply, listeners} end def handle_call(:listeners, _from, listeners) do {:reply, listeners, listeners} end end