   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
+  defdelegate files_to_path(manifest, stale, all, path, on_start), to: ManifestCompiler
 
   defp set_compiler_opts(project, opts, extra) do
     opts = Dict.take(opts, [:docs, :debug_info, :ignore_module_conflict, :warnings_as_errors])

      end
    end

    defp files_to_path(_pid, _entries, [], _compile_path, _cwd), do: :ok
    defp files_to_path(pid, entries, files, compile_path, cwd) do
      Kernel.ParallelCompiler.files :lists.usort(files),
        each_module: each_module(pid, compile_path, cwd, &1, &2, &3),
        each_file: each_file(&1),
        each_waiting: each_waiting(entries, &1)

      files_to_path(pid, entries, :gen_server.call(pid, :next), compile_path, cwd)
    end

    defp each_module(pid, compile_path, cwd, source, module, binary) do

    all   = opts[:force] || Mix.Utils.stale?(check_files, [manifest]) || path_deps_changed?(manifest)
    stale = if all, do: to_watch, else: Mix.Utils.extract_stale(to_watch, [manifest])

    files_to_path(manifest, stale, to_compile, compile_path, fn ->
      File.mkdir_p!(compile_path)
      Code.prepend_path(compile_path)
      set_compiler_opts(project, opts, [])
    end)
  end

  @doc """
