lib/backburner/hooks.rb in backburner-0.3.4 vs lib/backburner/hooks.rb in backburner-0.4.0

- old
+ new

@@ -1,51 +1,53 @@ module Backburner - module Hooks - # Triggers all method hooks that match the given event type with specified arguments. - # - # @example - # invoke_hook_events(:before_enqueue, 'some', 'args') - # invoke_hook_events(:after_perform, 5) - # - def invoke_hook_events(event, *args) - res = find_hook_events(event).map { |e| send(e, *args) } - return false if res.any? { |result| result == false } - res - end + class Hooks + class << self + # Triggers all method hooks that match the given event type with specified arguments. + # + # @example + # invoke_hook_events(:before_enqueue, 'some', 'args') + # invoke_hook_events(:after_perform, 5) + # + def invoke_hook_events(job, event, *args) + res = find_hook_events(job, event).map { |e| job.send(e, *args) } + return false if res.any? { |result| result == false } + res + end - # Triggers all method hooks that match given around event type. Used for 'around' hooks - # that stack over the original task cumulatively onto one another. - # - # The final block will be the one that actually invokes the - # original task after calling all other around blocks. - # - # @example - # around_hook_events(:around_perform) { job.perform } - # - def around_hook_events(event, *args, &block) - raise "Please pass a block to hook events!" unless block_given? - around_hooks = find_hook_events(event).reverse - aggregate_filter = Proc.new { |&blk| blk.call } - around_hooks.each do |ah| - prior_around_filter = aggregate_filter - aggregate_filter = Proc.new do |&blk| - method(ah).call(*args) do - prior_around_filter.call(&blk) + # Triggers all method hooks that match given around event type. Used for 'around' hooks + # that stack over the original task cumulatively onto one another. + # + # The final block will be the one that actually invokes the + # original task after calling all other around blocks. + # + # @example + # around_hook_events(:around_perform) { job.perform } + # + def around_hook_events(job, event, *args, &block) + raise "Please pass a block to hook events!" unless block_given? + around_hooks = find_hook_events(job, event).reverse + aggregate_filter = Proc.new { |&blk| blk.call } + around_hooks.each do |ah| + prior_around_filter = aggregate_filter + aggregate_filter = Proc.new do |&blk| + job.method(ah).call(*args) do + prior_around_filter.call(&blk) + end end end + aggregate_filter.call(&block) end - aggregate_filter.call(&block) - end - protected + protected - # Returns all methods that match given hook type - # - # @example - # find_hook_events(:before_enqueue) - # # => ['before_enqueue_foo', 'before_enqueue_bar'] - # - def find_hook_events(event) - (self.methods - Object.methods).grep(/^#{event}/).sort + # Returns all methods that match given hook type + # + # @example + # find_hook_events(:before_enqueue) + # # => ['before_enqueue_foo', 'before_enqueue_bar'] + # + def find_hook_events(job, event) + (job.methods - Object.methods).grep(/^#{event}/).sort + end end end # Hooks end # Backburner \ No newline at end of file