module ActionCallback

Constants

VERSION

Public Class Methods

extended(mod) click to toggle source
# File lib/action_callback.rb, line 12
def ActionCallback.extended(mod)
  initialize_callback_chain(mod)

  [:before, :after].each do |callback|
    define_callback(callback)
    alias_method :"#{callback}_filter", :"#{callback}_action"
  end

  initialize_validation_chain(mod)
  define_validation
end
version() click to toggle source
# File lib/action_callback/version.rb, line 4
def self.version
  VERSION
end

Private Instance Methods

define_callback(callback_hook) click to toggle source
# File lib/action_callback/define_callback.rb, line 10
  def define_callback(callback_hook)
    define_method("#{callback_hook}_action") do |callback, method_scope|
      @_callback_chain ||= Callback::Chain.new

      method_scope[:on].each do |mth_name|
        _callback_chain.append(callback_hook, mth_name, callback)

        undef_method(mth_name) if included_modules.map(&:to_s).include?('ActionWithCallbacks')

        class_eval <<-RUBY
          module ActionWithCallbacks
            define_method(:#{mth_name}) do |*args, &block|
              self.class._callback_chain.before_chain_of(:#{mth_name}).each { |cb| send(cb) }
              super(*args, &block)
              self.class._callback_chain.after_chain_of(:#{mth_name}).each { |cb| send(cb) }
            end
          end
        RUBY

        prepend self::ActionWithCallbacks
      end
    end
  end
define_validation() click to toggle source
Calls superclass method
# File lib/action_callback/define_validation.rb, line 10
  def define_validation
    define_method(:validate) do |*args, &block|
      @_validation_chain ||= Validation::Chain.new

      options = args.last
      if options.key?(:before)
        validator_mth_name = args.first
        options[:before].each do |mth_name|
          _validation_chain.append(:before, mth_name, validator_mth_name)
          undef_method(mth_name) if included_modules.map(&:to_s).include?('ActionWithValidations')

          class_eval <<-RUBY
            module ActionWithValidations
              define_method(:#{mth_name}) do |*args, &block|
                self.class._validation_chain.before_chain_of(:#{mth_name}).each { |v| send(v) }

                should_run = true
                should_run = !errors.present? if self.class.ancestors.include?(ActiveRecord::Base)

                super(*args, &block) if should_run
              end
            end
          RUBY

          prepend self::ActionWithValidations
        end
      else
        super(*args, &block)
      end
    end
  end
initialize_callback_chain(mod) click to toggle source
# File lib/action_callback/define_callback.rb, line 4
def initialize_callback_chain(mod)
  mod.define_singleton_method(:_callback_chain) do
    @_callback_chain
  end
end
initialize_validation_chain(mod) click to toggle source
# File lib/action_callback/define_validation.rb, line 4
def initialize_validation_chain(mod)
  mod.define_singleton_method(:_validation_chain) do
    @_validation_chain
  end
end