module WrapIt::Callbacks

Callbacks implementation

@author Alexey Ovchinnikov <alexiss@cybernetlab.ru>

Public Class Methods

included(base) click to toggle source
# File lib/wrap_it/callbacks.rb, line 16
def self.included(base)
  base.extend ClassMethods
end

Private Class Methods

define_callback(time, name) click to toggle source
# File lib/wrap_it/callbacks.rb, line 69
def self.define_callback(time, name)
  m_name = "#{time}_#{name}".to_sym
  var = "@#{m_name}".to_sym
  proc do
    define_singleton_method(m_name) do |method = nil, &block|
      return if block.nil? && !method.is_a?(Symbol)
      arr =
        if instance_variable_defined?(var)
          instance_variable_get(var)
        else
          instance_variable_set(var, [])
        end
      action = self == ancestors.first ? :unshift : :push
      arr.send(action, block || method)
      instance_variable_set(var, arr)
    end
  end
end

Public Instance Methods

run_callbacks(name) { || ... } click to toggle source

Runs specified callbacks with block

Runs first `before` callbacks in inheritance order, then yields block if it given and then `after` callbacks in reverse order.

@param name [Symbol] callback name, that should be defined by

{ClassMethods#callback callback} method.

@return [void]

# File lib/wrap_it/callbacks.rb, line 30
def run_callbacks(name)
  self.class.collect_derived("@before_#{name}").each do |cb|
    if cb.is_a?(Symbol)
      send(cb) # if respond_to?(cb)
    else
      instance_eval(&cb)
    end
  end
  yield if block_given?
  self.class.collect_derived("@after_#{name}").reverse.each do |cb|
    if cb.is_a?(Symbol)
      send(cb) # if respond_to?(cb)
    else
      instance_eval(&cb)
    end
  end
end