module Hooks::ClassMethods

def callbacks_for_hook(name)

would run callbacks in the object _instance_ context, passing +self+ as block parameter.

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)

where Cat.run_hook :after_eight will call the class method +grab_a_beer+.

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