# 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 .