Module: Termtter::Hookable

Included in:
Client, RubytterProxy
Defined in:
lib/termtter/hookable.rb

Class Method Summary collapse

Class Method Details

.included(base) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/termtter/hookable.rb', line 7

def self.included(base)
  base.class_eval do
    @hooks = {}

    class << self
      attr_reader :hooks

      def register_hook(arg, opts = {}, &block)
        hook = case arg
          when Hook
            arg
          when Hash
            Hook.new(arg)
          when String, Symbol
            options = { :name => arg }
            options.merge!(opts)
            options[:exec_proc] = block
            Hook.new(options)
          else
            raise ArgumentError, 'must be given Termtter::Hook, Hash, String or Symbol'
          end
        hooks[hook.name] = hook
      end

      def get_hook(name)
        hooks[name]
      end

      def get_hooks(point)
        # TODO: sort by alphabet
        hooks.values.select do |hook|
          hook.match?(point)
        end
      end

      # return last hook return value
      def call_hooks(point, *args)
        Termtter::Client.logger.debug "call_hooks: [:point => #{point}, :args => [#{args.map {|a| a.inspect.split(//)[0..10].join}.join(', ')}]]"
        result = nil
        get_hooks(point).each {|hook|
          break if result == false # interrupt if hook return false
          result = hook.call(*args)
        }
        result
      end

      def clear_hooks
        hooks.clear
      end
    end
  end
end