Sha256: 5336a635df1cd5fa13bdfade3516b0b66a2c51a01270b6a3cabf8d53eebc7cb8

Contents?: true

Size: 1.62 KB

Versions: 8

Compression:

Stored size: 1.62 KB

Contents

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

    # 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)
          end
        end
      end
      aggregate_filter.call(&block)
    end

    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
    end
  end # Hooks
end # Backburner

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
backburner-0.3.4 lib/backburner/hooks.rb
backburner-0.3.3 lib/backburner/hooks.rb
backburner-0.3.2 lib/backburner/hooks.rb
backburner-0.3.1 lib/backburner/hooks.rb
backburner-0.3.0 lib/backburner/hooks.rb
backburner-0.2.6 lib/backburner/hooks.rb
backburner-0.2.5 lib/backburner/hooks.rb
backburner-0.2.0 lib/backburner/hooks.rb