提交 a2b7fcb0 编写于 作者: J José Valim

Change callbacks to automatically include DescendantsTracker and rename descendents to descendants.

上级 8db8c6f4
require 'active_support/descendants_tracker'
require 'active_support/core_ext/array/wrap'
require 'active_support/core_ext/class/inheritable_attributes'
require 'active_support/core_ext/class/subclasses'
require 'active_support/core_ext/kernel/reporting'
require 'active_support/core_ext/kernel/singleton_class'
......@@ -85,6 +85,10 @@ module ActiveSupport
module Callbacks
extend Concern
included do
extend ActiveSupport::DescendantsTracker
end
def run_callbacks(kind, *args, &block)
send("_run_#{kind}_callbacks", *args, &block)
end
......@@ -428,7 +432,7 @@ def __update_callbacks(name, filters = [], block = nil) #:nodoc:
options = filters.last.is_a?(Hash) ? filters.pop : {}
filters.unshift(block) if block
([self] + self.descendents).each do |target|
([self] + self.descendants).each do |target|
chain = target.send("_#{name}_callbacks")
yield chain, type, filters, options
target.__define_runner(name)
......@@ -502,7 +506,7 @@ def skip_callback(name, *filter_list, &block)
def reset_callbacks(symbol)
callbacks = send("_#{symbol}_callbacks")
self.descendents.each do |target|
self.descendants.each do |target|
chain = target.send("_#{symbol}_callbacks")
callbacks.each { |c| chain.delete(c) }
target.__define_runner(symbol)
......
......@@ -11,9 +11,9 @@ def subclasses
# Rubinius
if defined?(Class.__subclasses__)
def descendents
def descendants
subclasses = []
__subclasses__.each {|k| subclasses << k; subclasses.concat k.descendents }
__subclasses__.each {|k| subclasses << k; subclasses.concat k.descendants }
subclasses
end
else
......@@ -21,7 +21,7 @@ def descendents
begin
ObjectSpace.each_object(Class.new) {}
def descendents
def descendants
subclasses = []
ObjectSpace.each_object(class << self; self; end) do |k|
subclasses << k unless k == self
......@@ -30,7 +30,7 @@ def descendents
end
# JRuby
rescue StandardError
def descendents
def descendants
subclasses = []
ObjectSpace.each_object(Class) do |k|
subclasses << k if k < self
......@@ -48,7 +48,7 @@ def descendents
def self.subclasses_of(*superclasses) #:nodoc:
subclasses = []
superclasses.each do |klass|
subclasses.concat klass.descendents.select {|k| k.anonymous? || k.reachable?}
subclasses.concat klass.descendants.select {|k| k.anonymous? || k.reachable?}
end
subclasses
end
......
require 'abstract_unit'
require 'test/unit'
require 'active_support'
require 'active_support/core_ext/hash/slice'
class DescendantsTrackerTest < Test::Unit::TestCase
class Parent
......@@ -19,6 +20,8 @@ class Grandchild1 < Child1
class Grandchild2 < Child1
end
ALL = [Parent, Child1, Child2, Grandchild1, Grandchild2]
def test_descendants
assert_equal [Child1, Grandchild1, Grandchild2, Child2], Parent.descendants
assert_equal [Grandchild1, Grandchild2], Child1.descendants
......@@ -32,9 +35,9 @@ def test_direct_descendants
end
def test_clear_with_autoloaded_parent_children_and_granchildren
mark_as_autoloaded Parent, Child1, Child2, Grandchild1, Grandchild2 do
mark_as_autoloaded *ALL do
ActiveSupport::DescendantsTracker.clear
assert_equal Hash.new, ActiveSupport::DescendantsTracker.descendants
assert ActiveSupport::DescendantsTracker.descendants.slice(*ALL).empty?
end
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册