12 if BufferManager.instantiated?
13 @__say_id = BufferManager.say s, @__say_id
14 BufferManager.draw_screen
21 Redwood::log "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
70 Dir.mkdir dir unless File.exists? dir
72 self.class.i_am_the_instance self
77 def run name, locals={}
78 hook = hook_for(name) or return
79 context = @contexts[hook] ||= HookContext.new(name)
83 result = context.__run hook, fn_for(name), locals
85 log "error running hook: #{e.message}"
86 log e.backtrace.join("\n")
87 @hooks[name] = nil # disable it
88 BufferManager.flash "Error running hook: #{e.message}" if BufferManager.instantiated?
93 def register name, desc
97 def print_hooks f=$stdout
99 Have #{@descs.size} registered hooks:
103 @descs.sort.each do |name, desc|
113 def enabled? name; !hook_for(name).nil? end
118 unless @hooks.member? name
120 returning IO.read(fn_for(name)) do
121 log "read '#{name}' from #{fn_for(name)}"
123 rescue SystemCallError => e
124 #log "disabled hook for '#{name}': #{e.message}"
133 File.join @dir, "#{name}.rb"
137 Redwood::log("hook: " + m)