lib/sup/hook.rb in sup-0.2 vs lib/sup/hook.rb in sup-0.3
- old
+ new
@@ -7,41 +7,51 @@
##
## how does rails do it, when you pass :locals into a partial?
##
## i don't bother providing setters, since i'm pretty sure the
## charade will fall apart pretty quickly with respect to scoping.
- ## this is basically fail-fast.
+ ## "fail-fast", we'll call it.
class HookContext
def initialize name
+ @__say_id = nil
@__name = name
@__locals = {}
end
attr_writer :__locals
def method_missing m, *a
case @__locals[m]
when Proc
- @__locals[m].call(*a)
+ @__locals[m] = @__locals[m].call(*a) # only call the proc once
when nil
super
else
@__locals[m]
end
end
def say s
- @__say_id = BufferManager.say s, @__say_id
- BufferManager.draw_screen
+ if BufferManager.instantiated?
+ @__say_id = BufferManager.say s, @__say_id
+ BufferManager.draw_screen
+ else
+ log s
+ end
end
def log s
Redwood::log "hook[#@__name]: #{s}"
end
def ask_yes_or_no q
- BufferManager.ask_yes_or_no q
+ if BufferManager.instantiated?
+ BufferManager.ask_yes_or_no q
+ else
+ print q
+ gets.chomp.downcase == 'y'
+ end
end
def __binding
binding
end
@@ -73,10 +83,11 @@
begin
result = context.instance_eval @hooks[name], fn_for(name)
rescue Exception => e
log "error running hook: #{e.message}"
log e.backtrace.join("\n")
+ @hooks[name] = nil # disable it
BufferManager.flash "Error running hook: #{e.message}"
end
context.__cleanup
result
end
@@ -98,9 +109,11 @@
File: #{fn_for name}
#{desc}
EOS
end
end
+
+ def enabled? name; !hook_for(name).nil? end
private
def hook_for name
unless @hooks.member? name