class Delayed::Callback
Public Class Methods
new()
click to toggle source
# File lib/delayed/lifecycle.rb, line 55 def initialize @before = [] @after = [] # Identity proc. Avoids special cases when there is no existing around chain. @around = lambda { |*args, &block| block.call(*args) } end
Public Instance Methods
add(type, &callback)
click to toggle source
# File lib/delayed/lifecycle.rb, line 70 def add(type, &callback) case type when :before @before << callback when :after @after << callback when :around chain = @around # use a local variable so that the current chain is closed over in the following lambda @around = lambda { |*a, &block| chain.call(*a) { |*b| callback.call(*b, &block) } } else raise InvalidCallback, "Invalid callback type: #{type}" end end
execute(*args, &block)
click to toggle source
# File lib/delayed/lifecycle.rb, line 63 def execute(*args, &block) @before.each { |c| c.call(*args) } result = @around.call(*args, &block) @after.each { |c| c.call(*args) } result end