module Capistrano
class Callback
attr_reader :source, :options, :only, :except
def initialize(source, options={})
@source = source
@options = options
@only = Array(options[:only]).map { |v| v.to_s }
@except = Array(options[:except]).map { |v| v.to_s }
end
def applies_to?(task)
if task && only.any?
return only.include?(task.fully_qualified_name)
elsif task && except.any?
return !except.include?(task.fully_qualified_name)
else
return true
end
end
end
class ProcCallback < Callback
def call
source.call
end
end
class TaskCallback < Callback
attr_reader :config
def initialize(config, source, options={})
super(source, options)
@config = config
end
def call
config.find_and_execute_task(source)
end
def applies_to?(task)
super && (task.nil? || task.fully_qualified_name != source.to_s)
end
end
end