From: "apotonick (Nick Sutterer)" Date: 2012-10-31T19:45:40+09:00 Subject: [ruby-core:48657] [ruby-trunk - Feature #7240] Inheritable #included/#extended Hooks For Modules Issue #7240 has been updated by apotonick (Nick Sutterer). =begin Ah ok, now I understand you, Alexey. Instead of having a keyword (inclusive/inheritable) you want to have a special "namespace" as in module M def to_be_inherited.m; end which would include the class method #m when including M? Cool. However, how would we make self.included "inheritable" then? > I wonder what the core developers would say. I talked to Matz at the Sapporo RubyKaigi this year and he made me file this issue! =end ---------------------------------------- Feature #7240: Inheritable #included/#extended Hooks For Modules https://bugs.ruby-lang.org/issues/7240#change-32087 Author: apotonick (Nick Sutterer) Status: Open Priority: Normal Assignee: Category: Target version: An inheritable hook mechanism for modules would be a great way for module/gem authors to simplify their implementations. The Problem ----------- Let's say I have the following module. module A def self.included(base) # add class methods to base end end So, A is overriding the #included hook to add class methods to base. module B include A # class methods from A are here. end Since B is including A, A's #included method is invoked and A's class methods will be copied to B. module C include B # class methods from B are lost. end When including B into C, B's #included is invoked and A's #included is lost. In our example, this means no class methods from A are in C. Proposal -------- It would be cool if #included/#extended in a module could be inherited to including descendants. I wrote a small gem "uber" that does this kind of stuff with a simple recursion. Roughly, it works like this. module A extend InheritableIncluded # "execute my #included everytime me or my descendents are included." def self.included(base) # add class methods to base end end Now, A's #included is invoked every time it or a descending module is included. In our example, class methods from A would be around in C. When discussing this with Matz we agreed that this might be really useful in Ruby itself. I'm just not sure how to mark inheritable hooks. -- http://bugs.ruby-lang.org/