class Redwood::HookManager

Attributes

descs[R]
tags[R]

Public Class Methods

new(dir) click to toggle source
# File lib/sup/hook.rb, line 80
def initialize dir
  @dir = dir
  @hooks = {}
  @contexts = {}
  @tags = {}

  Dir.mkdir dir unless File.exist? dir
end
register(name, desc) click to toggle source
# File lib/sup/hook.rb, line 108
def self.register name, desc
  @descs[name] = desc
end

Public Instance Methods

clear() click to toggle source
# File lib/sup/hook.rb, line 130
def clear; @hooks.clear; BufferManager.flash "Hooks cleared" end
clear_one(k;) click to toggle source
# File lib/sup/hook.rb, line 131
def clear_one k; @hooks.delete k; end
enabled?(name;) click to toggle source
# File lib/sup/hook.rb, line 128
def enabled? name; !hook_for(name).nil? end
print_hooks(pattern="", f=$stdout) click to toggle source
run(name, locals={}) click to toggle source
# File lib/sup/hook.rb, line 91
def run name, locals={}
  hook = hook_for(name) or return
  context = @contexts[hook] ||= HookContext.new(name)

  result = nil
  fn = fn_for name
  begin
    result = context.__run hook, fn, locals
  rescue Exception => e
    log "error running #{fn}: #{e.message}"
    log e.backtrace.join("\n")
    @hooks[name] = nil # disable it
    BufferManager.flash "Error running hook: #{e.message}" if BufferManager.instantiated?
  end
  result
end

Private Instance Methods

fn_for(name) click to toggle source
# File lib/sup/hook.rb, line 150
def fn_for name
  File.join @dir, "#{name}.rb"
end
hook_for(name) click to toggle source
# File lib/sup/hook.rb, line 135
def hook_for name
  unless @hooks.member? name
    @hooks[name] = begin
      returning IO.read(fn_for(name)) do
        debug "read '#{name}' from #{fn_for(name)}"
      end
    rescue SystemCallError => e
      #debug "disabled hook for '#{name}': #{e.message}"
      nil
    end
  end

  @hooks[name]
end
log(m) click to toggle source
# File lib/sup/hook.rb, line 154
def log m
  info("hook: " + m)
end