class ActiveSupport::Callbacks::Filters::Before

Public Class Methods

build(next_callback, user_callback, user_conditions, chain_config, filter) click to toggle source
# File lib/active_support/callbacks.rb, line 120
def self.build(next_callback, user_callback, user_conditions, chain_config, filter)
  halted_lambda = chain_config[:terminator]

  if chain_config.key?(:terminator) && user_conditions.any?
    halting_and_conditional(next_callback, user_callback, user_conditions, halted_lambda, filter)
  elsif chain_config.key? :terminator
    halting(next_callback, user_callback, halted_lambda, filter)
  elsif user_conditions.any?
    conditional(next_callback, user_callback, user_conditions)
  else
    simple next_callback, user_callback
  end
end

Private Class Methods

conditional(next_callback, user_callback, user_conditions) click to toggle source
# File lib/active_support/callbacks.rb, line 170
def self.conditional(next_callback, user_callback, user_conditions)
  lambda { |env|
    target = env.target
    value  = env.value

    if user_conditions.all? { |c| c.call(target, value) }
      user_callback.call target, value
    end
    next_callback.call env
  }
end
halting(next_callback, user_callback, halted_lambda, filter) click to toggle source
# File lib/active_support/callbacks.rb, line 153
def self.halting(next_callback, user_callback, halted_lambda, filter)
  lambda { |env|
    target = env.target
    value  = env.value
    halted = env.halted

    unless halted
      result = user_callback.call target, value
      env.halted = halted_lambda.call(target, result)
      if env.halted
        target.send :halted_callback_hook, filter
      end
    end
    next_callback.call env
  }
end
halting_and_conditional(next_callback, user_callback, user_conditions, halted_lambda, filter) click to toggle source
# File lib/active_support/callbacks.rb, line 136
def self.halting_and_conditional(next_callback, user_callback, user_conditions, halted_lambda, filter)
  lambda { |env|
    target = env.target
    value  = env.value
    halted = env.halted

    if !halted && user_conditions.all? { |c| c.call(target, value) }
      result = user_callback.call target, value
      env.halted = halted_lambda.call(target, result)
      if env.halted
        target.send :halted_callback_hook, filter
      end
    end
    next_callback.call env
  }
end
simple(next_callback, user_callback) click to toggle source
# File lib/active_support/callbacks.rb, line 182
def self.simple(next_callback, user_callback)
  lambda { |env|
    user_callback.call env.target, env.value
    next_callback.call env
  }
end