Class: Delayed::Callback

Inherits:
Object
  • Object
show all
Defined in:
lib/delayed/lifecycle.rb

Instance Method Summary collapse

Constructor Details

#initializeCallback

Returns a new instance of Callback.


65
66
67
68
69
70
71
# File 'lib/delayed/lifecycle.rb', line 65

def initialize
  @before = []
  @after = []

  # Identity proc. Avoids special cases when there is no existing around chain.
  @around = lambda { |*args, &block| block.call(*args) }
end

Instance Method Details

#add(type, &callback) ⇒ Object


80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/delayed/lifecycle.rb', line 80

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) ⇒ Object


73
74
75
76
77
78
# File 'lib/delayed/lifecycle.rb', line 73

def execute(*args, &block)
  @before.each { |c| c.call(*args) }
  result = @around.call(*args, &block)
  @after.each { |c| c.call(*args) }
  result
end