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:

  • wrapper to add to the stack

Returns:

Raises:

  • if the wrapper is not sufficient



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