   # GenServer callbacks
   #
 
+  def init([service, handlers]) do
+    {:ok, em} = GenEvent.start_link
+
+    Enum.each(handlers, fn
+      {module, args} ->
+        :ok = GenEvent.add_handler(em, module, args)
+      module ->
+        :ok = GenEvent.add_handler(em, module, [])
+    end)
+
+    {:ok, %{em: em, service: service, services: [], index: nil, task: nil}, 0}
+  end
+
   def init([service]) do
-    {:ok, em} = GenEvent.start_link
-    {:ok, %{em: em, service: service, services: [], index: nil, task: nil}, 0}
+    init([service, []])
   end
 
   # Seed node-service data and begin polling

    GenServer.start_link(__MODULE__, [service])
  end

  @spec async_poll(binary | integer, binary) :: Task.t
  def async_poll(index, service) do
    Task.async(__MODULE__, :poll, [index, service])
  end

  def add_handler(poller, module) when is_pid(poller) and is_atom(module) do
    GenServer.call(poller, {:add_handler, module})
  end

  @spec poll(binary | integer, binary) :: {:ok | :error, HTTPoison.Response.t | binary}
  def poll(index, service) do
    Consul.Health.service(index, service)
  end

  @spec subscribe(pid, atom, pid) :: :ok
  def subscribe(poller, module, subscriber) when is_pid(poller) and is_atom(module) and is_pid(subscriber) do
    GenServer.call(poller, {:subscribe, module, subscriber})
  end

  @spec unsubscribe(pid, atom, pid) :: :ok
  def unsubscribe(poller, module, subscriber) when is_pid(poller) and is_atom(module) and is_pid(subscriber) do
    GenServer.call(poller, {:unsubscribe, module, subscriber})
  end

  #

  def handle_info({ref, results}, %{task: %Task{ref: ref}} = state) do
    case results do
      {:ok, %{body: body} = response} ->
        case Discovery.Service.from_health(body) do
          [] = result ->
            new_services = result
          services ->
