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
59
60
61
62
63
64
65
66
67
68
69
70
|
# File 'lib/termtter/hookable.rb', line 13
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 remove_hook(name)
hooks.delete(name.to_sym)
end
def get_hook(name)
hooks[name]
end
def get_hooks(point)
hooks.values.select do |hook|
hook.match?(point)
end
end
def call_hooks(point, *args)
Termtter::Client.logger.debug { "call_hooks: [:point => #{point}, :args => [#{args.map {|a| a.inspect.each_char.take(11).join}.join(', ')}]]" }
result = nil
get_hooks(point).each {|hook|
break if result == false Termtter::Client.logger.debug { "call_hooks: #{point} #{hook.inspect}" }
result = hook.call(*args)
}
Termtter::Client.logger.debug { "call_hooks: [:point => #{point}, :args => [#{args.map {|a| a.inspect.each_char.take(11).join}.join(', ')}]], done" }
result
end
def clear_hooks
hooks.clear
end
end
end
end
|