Skip to content

Commit

Permalink
extract getting an setting callbacks to methods
Browse files Browse the repository at this point in the history
  • Loading branch information
tenderlove committed May 13, 2013
1 parent 72be280 commit b93cd60
Showing 1 changed file with 22 additions and 15 deletions.
37 changes: 22 additions & 15 deletions activesupport/lib/active_support/callbacks.rb
Original file line number Diff line number Diff line change
Expand Up @@ -448,7 +448,7 @@ def normalize_callback_params(name, filters, block) # :nodoc:
# CallbackChain.
def __update_callbacks(name) #:nodoc:
([self] + ActiveSupport::DescendantsTracker.descendants(self)).reverse.each do |target|
chain = target.send("_#{name}_callbacks")
chain = target.get_callbacks name
yield target, chain.dup
target.__reset_runner(name)
end
Expand Down Expand Up @@ -490,18 +490,15 @@ def __update_callbacks(name) #:nodoc:
# * <tt>:prepend</tt> - If +true+, the callback will be prepended to the
# existing chain rather than appended.
def set_callback(name, *filter_list, &block)
mapped = nil

type, filters, options = normalize_callback_params(name, filter_list, block)
chain = get_callbacks name
mapped = filters.map do |filter|
Callback.build(chain, filter, type, options.dup, self)
end

__update_callbacks(name) do |target, chain|
mapped ||= filters.map do |filter|
Callback.build(chain, filter, type, options.dup, self)
end

options[:prepend] ? chain.prepend(*mapped) : chain.append(*mapped)

target.send("_#{name}_callbacks=", chain)
target.set_callbacks name, chain
end
end

Expand All @@ -527,22 +524,22 @@ def skip_callback(name, *filter_list, &block)

chain.delete(filter)
end
target.send("_#{name}_callbacks=", chain)
target.set_callbacks name, chain
end
end

# Remove all set callbacks for the given event.
def reset_callbacks(symbol)
callbacks = send("_#{symbol}_callbacks")
callbacks = get_callbacks symbol

ActiveSupport::DescendantsTracker.descendants(self).each do |target|
chain = target.send("_#{symbol}_callbacks").dup
chain = target.get_callbacks(symbol).dup
callbacks.each { |c| chain.delete(c) }
target.send("_#{symbol}_callbacks=", chain)
target.set_callbacks symbol, chain
target.__reset_runner(symbol)
end

self.send("_#{symbol}_callbacks=", callbacks.dup.clear)
self.set_callbacks symbol, callbacks.dup.clear

__reset_runner(symbol)
end
Expand Down Expand Up @@ -618,9 +615,19 @@ def define_callbacks(*callbacks)
config = callbacks.last.is_a?(Hash) ? callbacks.pop : {}
callbacks.each do |callback|
class_attribute "_#{callback}_callbacks"
send("_#{callback}_callbacks=", CallbackChain.new(callback, config))
set_callbacks callback, CallbackChain.new(callback, config)
end
end

protected

def get_callbacks(name)
send "_#{name}_callbacks"
end

def set_callbacks(name, callbacks)
send "_#{name}_callbacks=", callbacks
end
end
end
end

0 comments on commit b93cd60

Please sign in to comment.