diff --git a/src/class.c b/src/class.c index bc73db358..7d19be40e 100644 --- a/src/class.c +++ b/src/class.c @@ -1632,8 +1632,8 @@ mrb_obj_extend(mrb_state *mrb, mrb_value obj) mrb_value mod = argv[argc]; mrb_check_type(mrb, mod, MRB_TT_MODULE); mrb_include_module(mrb, mrb_class_ptr(cc), mrb_class_ptr(mod)); - if (!mrb_func_basic_p(mrb, cc, extended, mrb_do_nothing)) { - mrb_funcall_argv(mrb, cc, extended, 1, &mod); + if (!mrb_func_basic_p(mrb, mod, extended, mrb_do_nothing)) { + mrb_funcall_argv(mrb, mod, extended, 1, &obj); } } return obj; diff --git a/test/t/class.rb b/test/t/class.rb index f4d99318a..65eb5edd4 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -477,3 +477,29 @@ assert('class with non-class/module outer raises TypeError') do assert_raise(TypeError) { class 0::C1; end } assert_raise(TypeError) { class []::C2; end } end + +assert('module with extended callback') do + module FooWithExtended + @@extended = [] + + def self.extended(base) + @@extended << base + end + + def self.extended_classes + @@extended + end + + def answer + 42 + end + end + + class BarBeingExtended + extend FooWithExtended + end + + assert_equal [BarBeingExtended], FooWithExtended.extended_classes + assert_true BarBeingExtended.respond_to?(:answer) + assert_equal 42, BarBeingExtended.answer +end