   # 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

    {:noreply, %{state | task: nil, index: nil}, @retry_ms}
  end

  def handle_call({:add_handler, module}, _from, %{em: em, services: services} = state) do
    :ok = GenEvent.add_handler(em, module, [])
    {:reply, GenEvent.sync_notify(em, {:services, services}), state}
  end

  def handle_call({:subscribe, module, subscriber}, _from, %{em: em, services: services} = state) do
    :ok = GenEvent.add_handler(em, {module, subscriber}, [], link: true)
    {:reply, GenEvent.sync_notify(em, {:services, services}), state}
  end

  def handle_call({:unsubscribe, module, subscriber}, _from, %{em: em} = state) do
    {:reply, GenEvent.remove_handler(em, {module, subscriber}, []), state}
  end
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 ->
