class Vagrant::Action::Hook
This class manages hooks into existing {Builder} stacks, and lets you add and remove middleware classes. This is the primary method by which plugins can hook into built-in middleware stacks.
Attributes
This is a hash of the middleware to append to a certain other middleware.
@return [Hash<Class, Array<Builder::StackItem>>]
This is a list of the hooks to just append to the end
@return [Array<Builder::StackItem>]
This is a hash of the middleware to prepend to a certain other middleware.
@return [Hash<Class, Array<Builder::StackItem>>]
This is a list of the hooks to just prepend to the beginning
@return [Array<Builder::StackItem>]
Public Class Methods
# File lib/vagrant/action/hook.rb, line 29 def initialize @before_hooks = Hash.new { |h, k| h[k] = [] } @after_hooks = Hash.new { |h, k| h[k] = [] } @prepend_hooks = [] @append_hooks = [] end
Public Instance Methods
Add a middleware after an existing middleware.
@param [Class] existing The existing middleware. @param [Class] new The new middleware.
# File lib/vagrant/action/hook.rb, line 56 def after(existing, new, *args, **keywords, &block) item = Builder::StackItem.new( middleware: new, arguments: Builder::MiddlewareArguments.new( parameters: args, keywords: keywords, block: block ) ) @after_hooks[existing] << item end
Append a middleware to the end of the stack. Note that if the middleware sequence ends early, then the new middleware won’t be run.
@param [Class] new The middleware to append.
# File lib/vagrant/action/hook.rb, line 73 def append(new, *args, **keywords, &block) item = Builder::StackItem.new( middleware: new, arguments: Builder::MiddlewareArguments.new( parameters: args, keywords: keywords, block: block ) ) @append_hooks << item end
This applies the given hook to a builder. This should not be called directly.
@param [Builder] builder
# File lib/vagrant/action/hook.rb, line 112 def apply(builder, options={}) if !options[:no_prepend_or_append] # Prepends first @prepend_hooks.each do |item| if options[:root] idx = builder.index(options[:root]) else idx = 0 end builder.insert(idx, item.middleware, *item.arguments.parameters, **item.arguments.keywords, &item.arguments.block) end # Appends @append_hooks.each do |item| if options[:root] idx = builder.index(options[:root]) builder.insert(idx + 1, item.middleware, *item.arguments.parameters, **item.arguments.keywords, &item.arguments.block) else builder.use(item.middleware, *item.arguments.parameters, **item.arguments.keywords, &item.arguments.block) end end end # Before hooks @before_hooks.each do |key, list| next if !builder.index(key) list.each do |item| builder.insert_before(key, item.middleware, *item.arguments.parameters, **item.arguments.keywords, &item.arguments.block) end end # After hooks @after_hooks.each do |key, list| next if !builder.index(key) list.each do |item| builder.insert_after(key, item.middleware, *item.arguments.parameters, **item.arguments.keywords, &item.arguments.block) end end end
Add a middleware before an existing middleware.
@param [Class] existing The existing middleware. @param [Class] new The new middleware.
# File lib/vagrant/action/hook.rb, line 40 def before(existing, new, *args, **keywords, &block) item = Builder::StackItem.new( middleware: new, arguments: Builder::MiddlewareArguments.new( parameters: args, keywords: keywords, block: block ) ) @before_hooks[existing] << item end
@return [Boolean]
# File lib/vagrant/action/hook.rb, line 101 def empty? before_hooks.empty? && after_hooks.empty? && prepend_hooks.empty? && append_hooks.empty? end
Prepend a middleware to the beginning of the stack.
@param [Class] new The new middleware to prepend.
# File lib/vagrant/action/hook.rb, line 88 def prepend(new, *args, **keywords, &block) item = Builder::StackItem.new( middleware: new, arguments: Builder::MiddlewareArguments.new( parameters: args, keywords: keywords, block: block ) ) @prepend_hooks << item end