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
71 Dir.mkdir dir unless File.exists? dir
73 self.class.i_am_the_instance self
78 def run name, locals={}
79 hook = hook_for(name) or return
80 context = @contexts[hook] ||= HookContext.new(name)
84 result = context.__run hook, fn_for(name), locals
86 log "error running hook: #{e.message}"
87 log e.backtrace.join("\n")
88 @hooks[name] = nil # disable it
89 BufferManager.flash "Error running hook: #{e.message}" if BufferManager.instantiated?
94 def register name, desc
98 def print_hooks f=$stdout
100 Have #{@descs.size} registered hooks:
104 @descs.sort.each do |name, desc|
114 def enabled? name; !hook_for(name).nil? end
119 unless @hooks.member? name
121 returning IO.read(fn_for(name)) do
122 log "read '#{name}' from #{fn_for(name)}"
124 rescue SystemCallError => e
125 #log "disabled hook for '#{name}': #{e.message}"
134 File.join @dir, "#{name}.rb"
138 Redwood::log("hook: " + m)