From: "matz (Yukihiro Matsumoto)" Date: 2012-11-05T13:30:08+09:00 Subject: [ruby-core:48875] [ruby-trunk - Feature #7240] Inheritable #included/#extended Hooks For Modules Issue #7240 has been updated by matz (Yukihiro Matsumoto). After skimming your modifies, I feel they are decent. Sorry for being late to check. Matz. ---------------------------------------- Feature #7240: Inheritable #included/#extended Hooks For Modules https://bugs.ruby-lang.org/issues/7240#change-32363 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/