
# the task manager

module ConsoleTaskManager
  extend self

  @@tasks = []

  def execute(name, &block)
    puts "Executing task: #{name}"
    task = @@tasks.select {|v| v[:name].eql? name}.first
    task = task[:klass].new
    task.instance_eval &block
    task.result
  end

  def register(name, klass)
    @@tasks << {name: name, klass: klass}
  end
end

# used to extend each task

module ConsoleTask
  def self.included(base)
    base.__send__(:define_singleton_method, :name) do |name|
      ConsoleTaskManager.register name, self
    end
  end

  def result
    nil
  end
end

# include and register all the tasks

Dir[File.dirname(__FILE__) + '/../tasks/*'].each {|file| require file }


# global scope for DSL

def console_task(name, &block)
  ConsoleTaskManager.execute(name, &block)
end