def task(name, options={}, &block)
name = name.to_sym
raise ArgumentError, "expected a block" unless block_given?
task_already_defined = tasks.key?(name)
if all_methods.any? { |m| m.to_sym == name } && !task_already_defined
thing = namespaces.key?(name) ? "namespace" : "method"
raise ArgumentError, "defining a task named `#{name}' would shadow an existing #{thing} with that name"
end
task = TaskDefinition.new(name, self, {:desc => next_description(:reset)}.merge(options), &block)
define_task(task)
end