module Callback
  module ModuleMethods
    # For each event_name submitted, defines a callback event with this name.
    # Client code can then register as a callback listener using object.event_name.
    def callback_events(*event_names)
      event_names.each do |event_name|
        define_callback_event(event_name)
      end
    end

    private
    def define_callback_event(event_name)
      module_eval <<-EOS
        def #{event_name}(&block)
          register_callback(:#{event_name}, &block)
        end
      EOS
    end
  end
end

class Module
  include Callback::ModuleMethods
end


syntax highlighted by Code2HTML, v. 0.9.1