Class: EXEL::Middleware::Chain
- Inherits:
-
Object
- Object
- EXEL::Middleware::Chain
- Defined in:
- lib/exel/middleware/chain.rb
Overview
Chain of middleware to be invoked in sequence around each processor execution.
Defined Under Namespace
Classes: Entry
Instance Attribute Summary collapse
-
#entries ⇒ Object
readonly
Returns the value of attribute entries.
Instance Method Summary collapse
-
#add(klass, *args) ⇒ Object
Adds a middleware class to the chain.
-
#include?(klass) ⇒ Boolean
Returns true if the given class is in the chain.
-
#initialize ⇒ Chain
constructor
A new instance of Chain.
-
#invoke(*args) ⇒ Object
Calls each middleware in the chain.
-
#remove(klass) ⇒ Object
Removes a middleware class from the chain.
Constructor Details
#initialize ⇒ Chain
Returns a new instance of Chain.
30 31 32 |
# File 'lib/exel/middleware/chain.rb', line 30 def initialize @entries = [] end |
Instance Attribute Details
#entries ⇒ Object (readonly)
Returns the value of attribute entries.
26 27 28 |
# File 'lib/exel/middleware/chain.rb', line 26 def entries @entries end |
Instance Method Details
#add(klass, *args) ⇒ Object
Adds a middleware class to the chain. If it is already in the chain it will be removed and added to the end. Any additional arguments will be passed to new
when the middleware is created.
36 37 38 39 |
# File 'lib/exel/middleware/chain.rb', line 36 def add(klass, *args) remove(klass) @entries << Entry.new(klass, args) end |
#include?(klass) ⇒ Boolean
Returns true if the given class is in the chain.
47 48 49 |
# File 'lib/exel/middleware/chain.rb', line 47 def include?(klass) @entries.any? { |entry| entry.klass == klass } end |
#invoke(*args) ⇒ Object
Calls each middleware in the chain.
52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/exel/middleware/chain.rb', line 52 def invoke(*args) chain = @entries.map { |entry| entry.klass.new(*entry.args) } traverse_chain = lambda do if chain.empty? yield else chain.shift.call(*args, &traverse_chain) end end traverse_chain.call end |
#remove(klass) ⇒ Object
Removes a middleware class from the chain.
42 43 44 |
# File 'lib/exel/middleware/chain.rb', line 42 def remove(klass) @entries.delete_if { |entry| entry.klass == klass } end |