module ActiveSupport::Callbacks::CallTemplate

def self.build(filter, callback)

the same after this point.
All of these objects are converted into a CallTemplate and handled

Objects:: An object with a before_foo method on it to call.
Procs:: A proc to call with the object.
Symbols:: A method to call.

Filters support:
def self.build(filter, callback)
  case filter
  when Symbol
    MethodCall.new(filter)
  when Conditionals::Value
    ProcCall.new(filter)
  when ::Proc
    if filter.arity > 1
      InstanceExec2.new(filter)
    elsif filter.arity > 0
      InstanceExec1.new(filter)
    else
      InstanceExec0.new(filter)
    end
  else
    ObjectCall.new(filter, callback.current_scopes.join("_").to_sym)
  end
end