12 if BufferManager.instantiated?
13 @__say_id = BufferManager.say s, @__say_id
14 BufferManager.draw_screen
21 info "hook[#@__name]: #{s}"
25 if BufferManager.instantiated?
26 BufferManager.ask_yes_or_no q
29 gets.chomp.downcase == 'y'
38 HookManager.tags[tag] = value
41 def __run __hook, __filename, __locals
43 __lprocs, __lvars = __locals.partition { |k, v| v.is_a?(Proc) }
44 eval __lvars.map { |k, v| "#{k} = __locals[#{k.inspect}];" }.join, __binding
45 ## we also support closures for delays evaluation. unfortunately
46 ## we have to do this via method calls, so you don't get all the
47 ## semantics of a regular variable. not ideal.
48 __lprocs.each do |k, v|
49 self.class.instance_eval do
51 @__cache[k] ||= v.call
55 ret = eval __hook, __binding, __filename
56 BufferManager.clear @__say_id if @__say_id
71 Dir.mkdir dir unless File.exists? dir
76 def run name, locals={}
77 hook = hook_for(name) or return
78 context = @contexts[hook] ||= HookContext.new(name)
82 result = context.__run hook, fn_for(name), locals
84 log "error running hook: #{e.message}"
85 log e.backtrace.join("\n")
86 @hooks[name] = nil # disable it
87 BufferManager.flash "Error running hook: #{e.message}" if BufferManager.instantiated?
92 def register name, desc
96 def print_hooks f=$stdout
98 Have #{@descs.size} registered hooks:
102 @descs.sort.each do |name, desc|
112 def enabled? name; !hook_for(name).nil? end
117 unless @hooks.member? name
119 returning IO.read(fn_for(name)) do
120 log "read '#{name}' from #{fn_for(name)}"
122 rescue SystemCallError => e
123 #log "disabled hook for '#{name}': #{e.message}"
132 File.join @dir, "#{name}.rb"