Module: Zeitwerk::Registry

Defined in:
lib/zeitwerk/registry.rb,
lib/zeitwerk/registry/inceptions.rb,
lib/zeitwerk/registry/explicit_namespaces.rb

Overview

:nodoc: all

Defined Under Namespace

Modules: ExplicitNamespaces, Inceptions

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.autoloadsObject (readonly)

Maps absolute paths to the loaders responsible for them.

This information is used by our decorated ‘Kernel#require` to be able to invoke callbacks and autovivify modules.



29
30
31
# File 'lib/zeitwerk/registry.rb', line 29

def autoloads
  @autoloads
end

.gem_loaders_by_root_fileObject (readonly)

Registers gem loaders to let ‘for_gem` be idempotent in case of reload.



20
21
22
# File 'lib/zeitwerk/registry.rb', line 20

def gem_loaders_by_root_file
  @gem_loaders_by_root_file
end

.loadersObject (readonly)

Keeps track of all loaders. Useful to broadcast messages and to prevent them from being garbage collected.



14
15
16
# File 'lib/zeitwerk/registry.rb', line 14

def loaders
  @loaders
end

Class Method Details

.loader_for(path) ⇒ Object



70
71
72
# File 'lib/zeitwerk/registry.rb', line 70

def loader_for(path)
  autoloads[path]
end

.loader_for_gem(root_file, namespace:, warn_on_extra_files:) ⇒ Object

This method returns always a loader, the same instance for the same root file. That is how Zeitwerk::Loader.for_gem is idempotent.



52
53
54
# File 'lib/zeitwerk/registry.rb', line 52

def loader_for_gem(root_file, namespace:, warn_on_extra_files:)
  gem_loaders_by_root_file[root_file] ||= GemLoader.__new(root_file, namespace: namespace, warn_on_extra_files: warn_on_extra_files)
end

.on_unload(loader) ⇒ Object



76
77
78
# File 'lib/zeitwerk/registry.rb', line 76

def on_unload(loader)
  autoloads.delete_if { |_path, object| object == loader }
end

.register_autoload(loader, abspath) ⇒ Object



58
59
60
# File 'lib/zeitwerk/registry.rb', line 58

def register_autoload(loader, abspath)
  autoloads[abspath] = loader
end

.register_loader(loader) ⇒ Object

Registers a loader.



35
36
37
# File 'lib/zeitwerk/registry.rb', line 35

def register_loader(loader)
  loaders << loader
end

.unregister_autoload(abspath) ⇒ Object



64
65
66
# File 'lib/zeitwerk/registry.rb', line 64

def unregister_autoload(abspath)
  autoloads.delete(abspath)
end

.unregister_loader(loader) ⇒ Object



41
42
43
44
45
# File 'lib/zeitwerk/registry.rb', line 41

def unregister_loader(loader)
  loaders.delete(loader)
  gem_loaders_by_root_file.delete_if { |_, l| l == loader }
  autoloads.delete_if { |_, l| l == loader }
end