4 ## there's probably a better way to do this, but to evaluate a hook
5 ## with a bunch of pre-set "local variables" i define a function
6 ## per variable and then instance_evaluate the code.
8 ## how does rails do it, when you pass :locals into a partial?
10 ## i don't bother providing setters, since i'm pretty sure the
11 ## charade will fall apart pretty quickly with respect to scoping.
12 ## this is basically fail-fast.
21 def method_missing m, *a
26 @__say_id = BufferManager.say s, @__say_id
27 BufferManager.draw_screen
31 Redwood::log "hook[#@__name]: #{s}"
35 BufferManager.ask_yes_or_no q
43 BufferManager.clear @__say_id if @__say_id
55 Dir.mkdir dir unless File.exists? dir
57 self.class.i_am_the_instance self
60 def run name, locals={}
61 hook = hook_for(name) or return
62 context = @contexts[hook] ||= HookContext.new(name)
63 context.__locals = locals
66 result = context.instance_eval @hooks[name], fn_for(name)
67 if result.is_a? String
68 log "got return value: #{result.inspect}"
69 BufferManager.flash result
72 log "error running hook: #{e.message}"
73 log e.backtrace.join("\n")
74 BufferManager.flash "Error running hook: #{e.message}"
79 def register name, desc
83 def print_hooks f=$stdout
85 Have #{@descs.size} registered hooks:
89 @descs.sort.each do |name, desc|
102 unless @hooks.member? name
105 returning IO.readlines(fn_for(name)).join do
106 log "read '#{name}' from #{fn_for(name)}"
108 rescue SystemCallError => e
117 File.join @dir, "#{name}.rb"
121 Redwood::log("hook: " + m)