Class: Circuitry::Middleware::Chain

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/circuitry/middleware/chain.rb

Instance Method Summary collapse

Constructor Details

#initialize {|_self| ... } ⇒ Chain

Returns a new instance of Chain.

Yields:

  • (_self)

Yield Parameters:



8
9
10
# File 'lib/circuitry/middleware/chain.rb', line 8

def initialize
  yield self if block_given?
end

Instance Method Details

#add(klass, *args) ⇒ Object



20
21
22
23
# File 'lib/circuitry/middleware/chain.rb', line 20

def add(klass, *args)
  remove(klass) if exists?(klass)
  entries << Entry.new(klass, *args)
end

#buildObject



50
51
52
# File 'lib/circuitry/middleware/chain.rb', line 50

def build
  map(&:build)
end

#clearObject



54
55
56
# File 'lib/circuitry/middleware/chain.rb', line 54

def clear
  entries.clear
end

#each(&block) ⇒ Object



12
13
14
# File 'lib/circuitry/middleware/chain.rb', line 12

def each(&block)
  entries.each(&block)
end

#entriesObject



16
17
18
# File 'lib/circuitry/middleware/chain.rb', line 16

def entries
  @entries ||= []
end

#exists?(klass) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
# File 'lib/circuitry/middleware/chain.rb', line 46

def exists?(klass)
  any? { |entry| entry.klass == klass }
end

#insert_after(old_klass, new_klass, *args) ⇒ Object



40
41
42
43
44
# File 'lib/circuitry/middleware/chain.rb', line 40

def insert_after(old_klass, new_klass, *args)
  new_entry = build_or_replace_entry(new_klass, *args)
  i = entries.index { |entry| entry.klass == old_klass } || entries.size - 1
  entries.insert(i + 1, new_entry)
end

#insert_before(old_klass, new_klass, *args) ⇒ Object



34
35
36
37
38
# File 'lib/circuitry/middleware/chain.rb', line 34

def insert_before(old_klass, new_klass, *args)
  new_entry = build_or_replace_entry(new_klass, *args)
  i = entries.index { |entry| entry.klass == old_klass } || 0
  entries.insert(i, new_entry)
end

#invoke(*args) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/circuitry/middleware/chain.rb', line 58

def invoke(*args)
  chain = build.dup

  traverse_chain = lambda do
    if chain.empty?
      yield
    else
      chain.shift.call(*args, &traverse_chain)
    end
  end

  traverse_chain.call
end

#prepend(klass, *args) ⇒ Object



29
30
31
32
# File 'lib/circuitry/middleware/chain.rb', line 29

def prepend(klass, *args)
  remove(klass) if exists?(klass)
  entries.unshift(Entry.new(klass, *args))
end

#remove(klass) ⇒ Object



25
26
27
# File 'lib/circuitry/middleware/chain.rb', line 25

def remove(klass)
  entries.delete_if { |entry| entry.klass == klass }
end