Sha256: 1989617920e55451460e602853fae5a28eacdf55f907f1546a792f44d7ff824b

Contents?: true

Size: 1.23 KB

Versions: 5

Compression:

Stored size: 1.23 KB

Contents

module Rubydora

  # Provides class level methods for handling
  # callback methods that alter object instances
  module Callbacks
    # add callback framework to base class
    # @param [Class] base
    def self.included(base)
      base.extend ExtendableClassMethods
    end

    # hooks support
    module ExtendableClassMethods
      # creates the @hooks container ("hooks" are blocks or procs).
      # returns an array
      def hooks
        @hooks ||= {}
      end

      # register callback procs
      # @param [Array<Symbol>] hook name
      def register_callback(*attrs)
        attrs.each do |method_name|
          next if methods.include? method_name.to_s
          instance_eval "
            def #{method_name}(&blk)
              self.hooks[:#{method_name}] ||= []
              self.hooks[:#{method_name}] << blk
            end

            def clear_#{method_name}_blocks!
              self.hooks[:#{method_name}] = []
            end
          "

          class_eval "
            def call_#{method_name}
              self.class.hooks[:#{method_name}] ||= []
              self.class.hooks[:#{method_name}].each do |h|
                instance_eval &h
              end
            end

          "
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
rubydora-2.2.0 lib/rubydora/callbacks.rb
rubydora-2.1.0 lib/rubydora/callbacks.rb
rubydora-2.0.0 lib/rubydora/callbacks.rb
rubydora-1.9.1 lib/rubydora/callbacks.rb
rubydora-1.9.0 lib/rubydora/callbacks.rb