defmodule Scopes.Core.Actor do require Logger defp loop(bhv) do receive do msg -> Logger.debug([msg: inspect(msg)]) case msg do {:message, msg} -> bhv.(msg) loop(bhv) {:become, bhv_n} -> loop(bhv_n) {:register, reg, name, value} -> Registry.register(reg, name, value) loop(bhv) {:quit} -> nil end end end def create(bhv) do spawn_link(fn -> loop(bhv) end) end def create(bhv, reg, name, value \\ []) do spawn_link(fn -> Registry.register(reg, name, value) loop(bhv) end) end def send(ac, msg, delay \\ 0) do if msg do Process.sleep(delay) Kernel.send(ac, {:message, msg}) end end def become(ac, bhv) do Kernel.send(ac, {:become, bhv}) end def register(ac, reg, name, value \\ []) do Kernel.send(ac, {:register, reg, name, value}) end def stop(ac) do Kernel.send(ac, {:quit}) end end