module Hooks::ClassMethods
def callbacks_for_hook(name)
end
instance_exec(self, &callback)
self.class.callbacks_for_hook(:after_eight).each do |callback|
def initialize
Example:
they should be executed in another context.
Returns the callbacks for +name+. Handy if you want to run the callbacks yourself, say when
def callbacks_for_hook(name) send("_#{name}_callbacks") end
def define_hook(name)
def define_hook(name) accessor_name = "_#{name}_callbacks" setup_hook_accessors(accessor_name) define_hook_writer(name, accessor_name) end
def define_hook_writer(hook, accessor_name)
def define_hook_writer(hook, accessor_name) self.send(:define_method, hook.to_sym) do |&block| if self.class.respond_to?(hook) self.class.send(hook.to_sym, &block) end end instance_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 def #{hook}(method=nil, &block) #{accessor_name} << (block || method) end RUBY_EVAL end
def run_hook(name, *args)
def self.grab_a_beer(*) # and so on...
after_eight :grab_a_beer
class Cat
Example:
Like Hooks#run_hook but for the class. Note that +:callbacks+ must be class methods.
def run_hook(name, *args) run_hook_for(name, self, *args) end
def run_hook_for(name, scope, *args)
def run_hook_for(name, scope, *args) callbacks_for_hook(name).each do |callback| if callback.kind_of? Symbol scope.send(callback, *args) else scope.instance_exec(*args, &callback) end end end
def setup_hook_accessors(accessor_name)
def setup_hook_accessors(accessor_name) inheritable_attr(accessor_name) send("#{accessor_name}=", []) # initialize ivar. end