master/lib/guard/hook.rb

75 lines
2.0 KiB
Ruby
Raw Normal View History

2011-04-10 23:08:43 +00:00
module Guard
module Hook
2011-04-10 23:08:43 +00:00
def self.included(base)
base.send :include, InstanceMethods
end
module InstanceMethods
# When +event+ is a Symbol, #hook will generate a hook name
# by concatenating the method name from where #hook is called
# with the given Symbol.
# Example:
# def run_all
# hook :foo
# end
# Here, when #run_all is called, #hook will notify callbacks
# registered for the "run_all_foo" event.
#
# When +event+ is a String, #hook will directly turn the String
# into a Symbol.
# Example:
# def run_all
# hook "foo_bar"
# end
# Here, when #run_all is called, #hook will notify callbacks
# registered for the "foo_bar" event.
#
# +args+ parameter is passed as is to the callbacks registered
# for the given event.
def hook(event, *args)
hook_name = if event.is_a? Symbol
2011-04-10 23:08:43 +00:00
calling_method = caller[0][/`([^']*)'/, 1]
"#{calling_method}_#{event}".to_sym
2011-04-10 23:08:43 +00:00
else
event.to_sym
2011-04-10 23:08:43 +00:00
end
if ENV["GUARD_ENV"] == "development"
UI.info "\nHook :#{hook_name} executed for #{self.class}"
end
Hook.notify(self.class, hook_name, *args)
2011-04-10 23:08:43 +00:00
end
end
class << self
def callbacks
@callbacks ||= Hash.new { |hash, key| hash[key] = [] }
end
def add_callback(listener, guard_class, events)
_events = events.is_a?(Array) ? events : [events]
2011-04-10 23:08:43 +00:00
_events.each do |event|
callbacks[[guard_class, event]] << listener
end
end
def has_callback?(listener, guard_class, event)
callbacks[[guard_class, event]].include?(listener)
2011-04-10 23:08:43 +00:00
end
def notify(guard_class, event, *args)
2011-04-10 23:08:43 +00:00
callbacks[[guard_class, event]].each do |listener|
listener.call(guard_class, event, *args)
2011-04-10 23:08:43 +00:00
end
end
def reset_callbacks!
2011-04-10 23:08:43 +00:00
@callbacks = nil
end
end
2011-04-10 23:08:43 +00:00
end
end