def on(event, *args, &block)
options = args.last.is_a?(Hash) ? args.pop : {}
callbacks[event] ||= []
if args.empty? && block.nil?
raise ArgumentError, "please specify either a task name or a block to invoke"
elsif args.any? && block
raise ArgumentError, "please specify only a task name or a block, but not both"
elsif block
callbacks[event] << ProcCallback.new(block, options)
else
args = filter_deprecated_tasks(args)
options[:only] = filter_deprecated_tasks(options[:only])
options[:except] = filter_deprecated_tasks(options[:except])
callbacks[event].concat(args.map { |name| TaskCallback.new(self, name, options) })
end
end