   * `:elixirc_options` - compilation options that applies
      to Elixir's compiler, they are: `:ignore_module_conflict`,
      `:docs` and `:debug_info`. By default, uses the same
-     behaviour as Elixir
+     behaviour as Elixir;
 
    * `:elixirc_exts` - extensions to compile whenever there
      is a change:

         [elixirc_watch_exts: [:ex, :eex]]

  """
  def run(args) do
    { opts, _ } = OptionParser.parse(args, aliases: [q: :quick],
                    switches: [force: :boolean, quick: :boolean])

    project       = Mix.project
    compile_path  = project[:compile_path]


    if opts[:force] or stale != [] do
      File.mkdir_p! compile_path
      compile_files opts[:quick], project, compile_path, to_compile, stale, opts
      :ok
    else
      :noop
    end
  end

  defp compile_files(true, project, compile_path, to_compile, stale, opts) do
    set_compiler_opts(project, opts, ignore_module_conflict: true)
    to_compile = lc f inlist to_compile, f in stale, do: f
    compile_files(to_compile, compile_path)
    File.touch! Path.join(compile_path, @manifest)
  end

  defp compile_files(false, project, compile_path, to_compile, _stale, opts) do
    Code.delete_path compile_path
    set_compiler_opts(project, opts, [])

    { _current, to_remove } =
      Mix.Utils.manifest Path.join(compile_path, @manifest), fn ->
