class Pry::Hooks

end
puts “hello”
Pry.config.hooks.add_hook(:before_session, :say_hi) do
@example Adding a hook for the ‘:before_session` event.
method.
have a name, and is connected with an event by the `Pry::Hooks#add_hook`
include: `:when_started`, `:before_session`, `:after_session`. A hook must
with an event. A number of events are currently provided by Pry, these
Implements a hooks system for Pry. A hook is a callable that is associated

def self.default

def self.default
  hooks = new
  hooks.add_hook(:before_session, :default) do |_out, _target, pry_instance|
    next if pry_instance.quiet?
    pry_instance.run_command('whereami --quiet')
  end
  hooks
end

def add_hook(event_name, hook_name, callable = nil, &block)

Returns:
  • (Pry:Hooks) - The receiver.

Other tags:
    Yield: - The block to use as the callable (if no `callable` provided).

Parameters:
  • callable (#call) -- The callable.
  • hook_name (Symbol) -- The name of the hook.
  • event_name (Symbol) -- The name of the event.
def add_hook(event_name, hook_name, callable = nil, &block)
  event_name = event_name.to_s
  # do not allow duplicates, but allow multiple `nil` hooks
  # (anonymous hooks)
  if hook_exists?(event_name, hook_name) && !hook_name.nil?
    raise ArgumentError, "Hook with name '#{hook_name}' already defined!"
  end
  raise ArgumentError, "Must provide a block or callable." if !block && !callable
  # ensure we only have one anonymous hook
  @hooks[event_name].delete_if { |h, _k| h.nil? } if hook_name.nil?
  if block
    @hooks[event_name] << [hook_name, block]
  elsif callable
    @hooks[event_name] << [hook_name, callable]
  end
  self
end

def clear_event_hooks(event_name)

Returns:
  • (void) -

Parameters:
  • event_name (String) -- The name of the event.
def clear_event_hooks(event_name)
  @hooks[event_name.to_s] = []
end

def delete_hook(event_name, hook_name)

Returns:
  • (#call) - The deleted hook.

Parameters:
  • hook_name (Symbol) -- The name of the hook.
  • event_name (Symbol) -- The name of the event.
def delete_hook(event_name, hook_name)
  deleted_callable = nil
  @hooks[event_name.to_s].delete_if do |current_hook_name, callable|
    if current_hook_name == hook_name
      deleted_callable = callable
      true
    else
      false
    end
  end
  deleted_callable
end

def errors

def errors
  @errors ||= []
end

def exec_hook(event_name, *args, &block)

Returns:
  • (Object) - The return value of the last executed hook.

Parameters:
  • args (Array) -- The arguments to pass to each hook function.
  • event_name (Symbol) -- The name of the event.
def exec_hook(event_name, *args, &block)
  @hooks[event_name.to_s].map do |_hook_name, callable|
    begin
      callable.call(*args, &block)
    rescue RescuableException => e
      errors << e
      e
    end
  end.last
end

def get_hook(event_name, hook_name)

Returns:
  • (#call) - a specific hook for a given event.

Parameters:
  • hook_name (Symbol) -- The name of the hook
  • event_name (Symbol) -- The name of the event.
def get_hook(event_name, hook_name)
  hook = @hooks[event_name.to_s].find do |current_hook_name, _callable|
    current_hook_name == hook_name
  end
  hook.last if hook
end

def get_hooks(event_name)

Other tags:
    Note: - Modifying the returned hash does not alter the hooks, use

Returns:
  • (Hash) - The hash of hook names / hook functions.

Parameters:
  • event_name (Symbol) -- The name of the event.
def get_hooks(event_name)
  Hash[@hooks[event_name.to_s]]
end

def hook_count(event_name)

Returns:
  • (Fixnum) - The number of hook functions for `event_name`.

Parameters:
  • event_name (Symbol) -- The name of the event.
def hook_count(event_name)
  @hooks[event_name.to_s].size
end

def hook_exists?(event_name, hook_name)

Returns:
  • (Boolean) - Whether the hook by the name `hook_name`.

Parameters:
  • hook_name (Symbol) -- Name of the hook.
  • event_name (Symbol) -- Name of the event.
def hook_exists?(event_name, hook_name)
  @hooks[event_name.to_s].map(&:first).include?(hook_name)
end

def initialize

def initialize
  @hooks = Hash.new { |h, k| h[k] = [] }
end

def initialize_copy(_orig)

Ensure that duplicates have their @hooks object.
def initialize_copy(_orig)
  hooks_dup = @hooks.dup
  @hooks.each do |k, v|
    hooks_dup[k] = v.dup
  end
  @hooks = hooks_dup
end

def merge(other)

Returns:
  • (Pry::Hooks) - a new `Pry::Hooks` instance containing a merge of the

Parameters:
  • other (Pry::Hooks) -- The `Pry::Hooks` instance to merge
def merge(other)
  dup.tap do |v|
    v.merge!(other)
  end
end

def merge!(other)

Other tags:
    See: #merge -

Returns:
  • (Pry:Hooks) - The receiver.

Parameters:
  • other (Pry::Hooks) -- The `Pry::Hooks` instance to merge
def merge!(other)
  @hooks.merge!(other.dup.hooks) do |_key, array, other_array|
    temp_hash = {}
    output = []
    (array + other_array).reverse_each do |pair|
      temp_hash[pair.first] ||= output.unshift(pair)
    end
    output
  end
  self
end