class RDoc::Task

def before_running_rdoc(&block)

def before_running_rdoc(&block)
  @before_running_rdoc = block
end

def clobber_task_name

def clobber_task_name
  case name
  when Hash then (name[:clobber_rdoc] || "clobber_rdoc").to_s
  else           "clobber_#{name}"
  end
end

def define

def define
  desc "Build RDoc HTML files"
  task rdoc_task_name
  desc "Rebuild RDoc HTML files"
  task rerdoc_task_name => [clobber_task_name, rdoc_task_name]
  desc "Remove RDoc HTML files"
  task clobber_task_name do
    rm_r @rdoc_dir rescue nil
  end
  task :clobber => [clobber_task_name]
  directory @rdoc_dir
  rdoc_target_deps = [
    @rdoc_files,
    Rake.application.rakefile
  ].flatten.compact
  task rdoc_task_name => [rdoc_target]
  file rdoc_target => rdoc_target_deps do
    @before_running_rdoc.call if @before_running_rdoc
    args = option_list + @rdoc_files
    if Rake.application.options.trace then
      $stderr.puts "rdoc #{args.join ' '}"
    end
    require 'rdoc/rdoc'
    RDoc::RDoc.new.document(args)
  end
  self
end

def initialize(name = :rdoc) # :yield: self

:yield: self
def initialize(name = :rdoc)  # :yield: self
  if name.is_a? Hash then
    invalid_options = name.keys.map { |k| k.to_sym } -
      [:rdoc, :clobber_rdoc, :rerdoc]
    unless invalid_options.empty? then
      raise ArgumentError, "invalid options: #{invalid_options.join(", ")}"
    end
  end
  @name = name
  @rdoc_files = Rake::FileList.new
  @rdoc_dir = 'html'
  @main = nil
  @title = nil
  @template = nil
  @options = []
  yield self if block_given?
  define
end

def option_list

def option_list
  result = @options.dup
  result << "-o"      << @rdoc_dir
  result << "--main"  << main     if main
  result << "--title" << title    if title
  result << "-T"      << template if template
  result
end

def rdoc_target

def rdoc_target
  "#{rdoc_dir}/index.html"
end

def rdoc_task_name

def rdoc_task_name
  case name
  when Hash then (name[:rdoc] || "rdoc").to_s
  else           name.to_s
  end
end

def rerdoc_task_name

def rerdoc_task_name
  case name
  when Hash then (name[:rerdoc] || "rerdoc").to_s
  else           "re#{name}"
  end
end