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) {:quit} -> nil end end end def create(bhv) do spawn_link(fn -> loop(bhv) end) end def send(ac, msg, delay \\ 0) do Process.sleep(delay) #Process.send_after(ac, {:message, msg}, delay) Kernel.send(ac, {:message, msg}) end def become(ac, bhv) do Kernel.send(ac, {:become, bhv}) end def stop(ac) do Kernel.send(ac, {:quit}) end end