@@ -8,6 +8,29 @@ module Mongoid
88 # around traversing the document graph.
99 module Traversable
1010 extend ActiveSupport ::Concern
11+ # This code is extracted from ActiveSupport so that we do not depend on
12+ # their private API that may change at any time.
13+ # This code should be reviewed and maybe removed when implementing
14+ # https://jira.mongodb.org/browse/MONGOID-5832
15+ class << self
16+ # @api private
17+ def __redefine ( owner , name , value )
18+ if owner . singleton_class?
19+ owner . redefine_method ( name ) { value }
20+ owner . send ( :public , name )
21+ end
22+ owner . redefine_singleton_method ( name ) { value }
23+ owner . singleton_class . send ( :public , name )
24+ owner . redefine_singleton_method ( "#{ name } =" ) do |new_value |
25+ if owner . equal? ( self )
26+ value = new_value
27+ else
28+ ::Mongoid ::Traversable . redefine ( self , name , new_value )
29+ end
30+ end
31+ owner . singleton_class . send ( :public , "#{ name } =" )
32+ end
33+ end
1134
1235 # Class-level methods for the Traversable behavior.
1336 module ClassMethods
@@ -105,11 +128,7 @@ def discriminator_key=(value)
105128 if value
106129 Mongoid ::Fields ::Validators ::Macro . validate_field_name ( self , value )
107130 value = value . to_s
108- if defined? ( ::ActiveSupport ::ClassAttribute )
109- ::ActiveSupport ::ClassAttribute . redefine ( self , 'discriminator_key' , value )
110- else
111- super
112- end
131+ ::Mongoid ::Traversable . __redefine ( self , 'discriminator_key' , value )
113132 else
114133 # When discriminator key is set to nil, replace the class's definition
115134 # of the discriminator key reader (provided by class_attribute earlier)
0 commit comments