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