class Zeitwerk::Loader

def unload

@sig () -> void

`unregister`, which is undocumented too.
means `unload` + `setup`. This one is available to be used together with
This method is public but undocumented. Main interface is `reload`, which

unload them.
else, they are eligible for garbage collection, which would effectively
addition, since said objects are normally not referenced from anywhere
The objects the constants stored are no longer reachable through them. In

Removes loaded constants and configured autoloads.
def unload
  mutex.synchronize do
    raise SetupRequired unless @setup
    # We are going to keep track of the files that were required by our
    # autoloads to later remove them from $LOADED_FEATURES, thus making them
    # loadable by Kernel#require again.
    #
    # Directories are not stored in $LOADED_FEATURES, keeping track of files
    # is enough.
    unloaded_files = Set.new
    autoloads.each do |abspath, (parent, cname)|
      if parent.autoload?(cname)
        unload_autoload(parent, cname)
      else
        # Could happen if loaded with require_relative. That is unsupported,
        # and the constant path would escape unloadable_cpath? This is just
        # defensive code to clean things up as much as we are able to.
        unload_cref(parent, cname)
        unloaded_files.add(abspath) if ruby?(abspath)
      end
    end
    to_unload.each do |cpath, (abspath, (parent, cname))|
      unless on_unload_callbacks.empty?
        begin
          value = cget(parent, cname)
        rescue ::NameError
          # Perhaps the user deleted the constant by hand, or perhaps an
          # autoload failed to define the expected constant but the user
          # rescued the exception.
        else
          run_on_unload_callbacks(cpath, value, abspath)
        end
      end
      unload_cref(parent, cname)
      unloaded_files.add(abspath) if ruby?(abspath)
    end
    unless unloaded_files.empty?
      # Bootsnap decorates Kernel#require to speed it up using a cache and
      # this optimization does not check if $LOADED_FEATURES has the file.
      #
      # To make it aware of changes, the gem defines singleton methods in
      # $LOADED_FEATURES:
      #
      #   https://github.com/Shopify/bootsnap/blob/master/lib/bootsnap/load_path_cache/core_ext/loaded_features.rb
      #
      # Rails applications may depend on bootsnap, so for unloading to work
      # in that setting it is preferable that we restrict our API choice to
      # one of those methods.
      $LOADED_FEATURES.reject! { |file| unloaded_files.member?(file) }
    end
    autoloads.clear
    autoloaded_dirs.clear
    to_unload.clear
    namespace_dirs.clear
    shadowed_files.clear
    Registry.on_unload(self)
    ExplicitNamespace.__unregister_loader(self)
    @setup        = false
    @eager_loaded = false
  end
end