diff --git a/object.c b/object.c index 74f58a15bd..5a379e9d08 100644 --- a/object.c +++ b/object.c @@ -1193,6 +1193,30 @@ rb_class_search_ancestor(VALUE cl, VALUE c) * * Added :FOO * + * If we define a class using the class keyword, const_added + * runs before inherited: + * + * module M + * def self.const_added(const_name) + * super + * p :const_added + * end + * + * parent = Class.new do + * def self.inherited(subclass) + * super + * p :inherited + * end + * end + * + * class Child < parent + * end + * end + * + * produces: + * + * :const_added + * :inherited */ #define rb_obj_mod_const_added rb_obj_dummy1 diff --git a/spec/ruby/core/module/const_added_spec.rb b/spec/ruby/core/module/const_added_spec.rb index 4b10dd5963..1b3dad514b 100644 --- a/spec/ruby/core/module/const_added_spec.rb +++ b/spec/ruby/core/module/const_added_spec.rb @@ -199,5 +199,25 @@ describe "Module#const_added" do ScratchPad.recorded.should == [123, 456] end + + it "for a class defined with the `class` keyword, const_added runs before inherited" do + ScratchPad.record [] + + mod = Module.new do + def self.const_added(_) + ScratchPad << :const_added + end + end + + parent = Class.new do + def self.inherited(_) + ScratchPad << :inherited + end + end + + class mod::C < parent; end + + ScratchPad.recorded.should == [:const_added, :inherited] + end end end