]> git.cworth.org Git - sup/blobdiff - lib/sup/hook.rb
Merge commit 'origin/reply-from-hook'
[sup] / lib / sup / hook.rb
index 8c4a2aee6fd54dc47628c8526f87467adfaa0a35..94949195d31090b72de33480318d819e081fc02f 100644 (file)
@@ -9,9 +9,10 @@ class HookManager
   ##
   ## 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
@@ -21,7 +22,7 @@ class HookManager
     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
@@ -30,8 +31,12 @@ class HookManager
     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
@@ -39,7 +44,12 @@ class HookManager
     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 
@@ -75,7 +85,8 @@ class HookManager
     rescue Exception => e
       log "error running hook: #{e.message}"
       log e.backtrace.join("\n")
-      BufferManager.flash "Error running hook: #{e.message}"
+      @hooks[name] = nil # disable it
+      BufferManager.flash "Error running hook: #{e.message}" if BufferManager.instantiated?
     end
     context.__cleanup
     result
@@ -101,17 +112,19 @@ EOS
     end
   end
 
+  def enabled? name; !hook_for(name).nil? end
+
 private
 
   def hook_for name
     unless @hooks.member? name
       @hooks[name] =
         begin
-          returning IO.readlines(fn_for(name)).join do
+          returning IO.read(fn_for(name)) do
             log "read '#{name}' from #{fn_for(name)}"
           end
         rescue SystemCallError => e
-          log "disabled hook for '#{name}': #{e.message}"
+          #log "disabled hook for '#{name}': #{e.message}"
           nil
         end
     end