class Module

so, if Bootsnap were to do prepend, it might end up breaking RubyGems.
That’s because RubyGems does alias-method-chain for Kernel#require and such,
So, why does Bootsnap do alias-method-chain and not prepend? Glad you asked!
and prepended modules and alias-method-chain don’t play well together.
We need to do the alias-method-chain dance since Bootsnap does the same,

def append_features(constant)

def append_features(constant)
  Tapioca::Runtime::Trackers::Mixin.register(
    constant,
    self,
    Tapioca::Runtime::Trackers::Mixin::Type::Include,
  )
  super
end

def autoload(const_name, path)

def autoload(const_name, path)
  Tapioca::Runtime::Trackers::Autoload.register("#{self}::#{const_name}")
  autoload_without_tapioca(const_name, path)
end

def extend_object(obj)

def extend_object(obj)
  Tapioca::Runtime::Trackers::Mixin.register(
    obj,
    self,
    Tapioca::Runtime::Trackers::Mixin::Type::Extend,
  ) if Module === obj
  super
end

def prepend_features(constant)

def prepend_features(constant)
  Tapioca::Runtime::Trackers::Mixin.register(
    constant,
    self,
    Tapioca::Runtime::Trackers::Mixin::Type::Prepend,
  )
  super
end