module Ratonvirus::Scanner::Support::Callbacks

Provides a simple callbacks implementation to be used with the scanners.

We cannot use the ActiveSupport::Callbacks because that applies the callbacks to the whole class. We only want to define callbacks on the single instance of a class.

Defining new callbacks hooks to the instance:

class Cls
  include Ratonvirus::Support::Callbacks

  def initialize
    define_callbacks :hook
  end
end

Triggering the callback hooks:

class Cls
  # ...
  def some_method
    run_callbacks :hook, resource do
      puts "... do something ..."
    end
  end
  # ...
end

Applying functionality to the hooks:

class Cls
  def attach_callbacks
    before_hook :run_before
    after_hook :run_after
  end

  def run_before
    puts "This is run before the hook"
  end

  def run_after
    puts "This is run after the hook"
  end
end

Private Instance Methods

define_callbacks(type) click to toggle source
# File lib/ratonvirus/scanner/support/callbacks.rb, line 67
def define_callbacks(type)
  @_callbacks ||= {}
  @_callbacks[type] ||= {}
  @_callbacks[type][:before] = []
  @_callbacks[type][:after] = []

  define_singleton_method "before_#{type}" do |callable|
    @_callbacks[type][:before] << callable
  end
  define_singleton_method "after_#{type}" do |callable|
    @_callbacks[type][:after] << callable
  end
end
run_callback_callables(callables, *args) click to toggle source
# File lib/ratonvirus/scanner/support/callbacks.rb, line 61
def run_callback_callables(callables, *args)
  callables.each do |callable|
    send(callable, *args)
  end
end
run_callbacks(type, *args) { |*args| ... } click to toggle source
# File lib/ratonvirus/scanner/support/callbacks.rb, line 50
def run_callbacks(type, *args, &_block)
  raise NotDefinedError, "No callbacks defined" if @_callbacks.nil?
  raise NotDefinedError, "Callbacks for #{type} not defined" if @_callbacks[type].nil?

  run_callback_callables @_callbacks[type][:before], *args
  result = yield(*args)
  run_callback_callables @_callbacks[type][:after], *args

  result
end