Project

General

Profile

Feature #7240

Inheritable #included/#extended Hooks For Modules

Added by apotonick (Nick Sutterer) almost 8 years ago. Updated almost 3 years ago.

Status:
Feedback
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:48549]

Description

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.

Also available in: Atom PDF