Class: MySQLNoIo::WrapStack

Inherits:
Object
  • Object
show all
Defined in:
lib/mysqlnoio/wrap_stack.rb

Overview

A WrapStack collects a series of Wraps, and runs their #execute commands inside one another.

Example:

stack = MySQLNoIo::WrapStack.new()a

wrapFoo = Wrap::Foo.new()
wrapBar = Wrap::Bar.new()

stack.add_stack wrapFoo
stack.add_stack wrapBar
stack.execute do
  puts "hi"
end

Is identical to:
wrapFoo.execute do
  wrapBar.execute do
    puts "hi"
  end
end

Instance Method Summary collapse

Constructor Details

#initializeWrapStack

Returns a new instance of WrapStack.



26
27
28
# File 'lib/mysqlnoio/wrap_stack.rb', line 26

def initialize
  @wraps = []
end

Instance Method Details

#add_wrap(wrap) ⇒ TrueClass

Add a layer to wrap around the execution of the command

Parameters:

Returns:

  • (TrueClass)

Raises:



36
37
38
39
40
41
42
43
44
# File 'lib/mysqlnoio/wrap_stack.rb', line 36

def add_wrap wrap
  unless wrap.respond_to?('execute')
    raise MySQLNoIo::Errors::ArgumentError.new('Wrap must respond to #execute and accept a block.')
  end

  @wraps << wrap

  true
end

#execute(&block) ⇒ Object

Execute your bit of code from within the safety and comfort of the wrappers appended to the stack.



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/mysqlnoio/wrap_stack.rb', line 48

def execute &block
  # Brace yourself.
  #
  # This next bit of code creates a nested lamda like the WrapStack
  # describes.
  deep_proc = @wraps.reverse.inject(block) do |deep_proc, layer|
    Proc.new do
      layer.execute do
        deep_proc.call
      end
    end
  end

  deep_proc.call
end