Project

General

Profile

Actions

Feature #17881

open

Add a Module#const_added callback

Added by byroot (Jean Boussier) 4 months ago. Updated about 2 months ago.

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

Description

Use case

Autoloaders like zeitwerk need a callback when a new class or module is registered in the constant table.

Currently this is implemented with TracePoint's :class event. It works, but it is a bit unfortunate to have to use an API intended for debugging to implement production features. It doesn't feel "conceptually clean".

It also doesn't play well with MJIT, even though it's more of an MJIT limitation.

Additionally this usage of TracePoint cause some incompatibilities with some debuggers like byebug (even though others don't have this issue).

Proposal

I believe that if Ruby was to call Module#const_added when a constant is registered, Zeitwerk could get rid of TracePoint.

For now I implemented it as: const_added(const_name) for similarity with method_added. But maybe it could make sense to have the signature be const_added(const_name, const_value).

Also since method_removed exists, maybe const_removed would need to be added for consistency.

Links

Patch: https://github.com/ruby/ruby/pull/4521
Zeitwerk side discussion: https://github.com/fxn/zeitwerk/issues/135

cc k0kubun (Takashi Kokubun)

Actions

Also available in: Atom PDF