     use GenServer.Behaviour
     @moduledoc false
 
-    def files_to_path(manifest, stale, all, compile_path) do
-      entries = read_manifest(manifest)
+    def files_to_path(manifest, stale, all, compile_path, on_start) do
+      all_entries = read_manifest(manifest)
 
       # Each entry that is not in all must be removed
-      entries = lc { beam, _m, source, _d } = entry inlist entries,
+      entries = lc { beam, _m, source, _d } = entry inlist all_entries,
                    is_in_list_or_remove(source, all, beam),
                    do: entry
 

  in between modules, which helps it recompile only the modules that
  have changed at runtime.
  """
  defdelegate files_to_path(manifest, stale, all, path), to: ManifestCompiler

  defp set_compiler_opts(project, opts, extra) do
    opts = Dict.take(opts, [:docs, :debug_info, :ignore_module_conflict, :warnings_as_errors])

                          not Enum.any?(entries, fn { _b, _m, s, _d } -> s == i end),
                          do: i

      cond do
        stale != [] ->
          on_start.()
          { :ok, pid } = :gen_server.start_link(__MODULE__, entries, [])

          try do
            do_files_to_path(pid, entries, stale, compile_path, File.cwd)
            :gen_server.cast(pid, :merge)
          after
            :gen_server.call(pid, { :stop, manifest })
          end

          :ok
        all_entries != entries ->
          :ok
        true ->
          :noop
      end
    end

