module Appsignal::Loaders

def instances

def instances
  @instances ||= {}
end

def load(name_str)

def load(name_str)
  name = name_str.to_sym
  unless registered?(name)
    require_loader(name)
    unless registered?(name)
      Appsignal.internal_logger
        .warn("No loader found with the name '#{name}'.")
      return
    end
  end
  Appsignal.internal_logger.debug("Loading '#{name}' loader")
  begin
    loader_klass = loaders[name]
    loader = loader_klass.new
    instances[name] = loader
    loader.on_load if loader.respond_to?(:on_load)
  rescue => e
    Appsignal.internal_logger.error(
      "An error occurred while loading the '#{name}' loader: " \
        "#{e.class}: #{e.message}\n#{e.backtrace}"
    )
  end
end

def loaders

def loaders
  @loaders ||= {}
end

def register(name, klass)

def register(name, klass)
  loaders[name.to_sym] = klass
end

def registered?(name)

def registered?(name)
  loaders.key?(name)
end

def require_loader(name)

def require_loader(name)
  require "appsignal/loaders/#{name}"
rescue LoadError
  nil
end

def start

def start
  instances.each do |name, instance|
    Appsignal.internal_logger.debug("Starting '#{name}' loader")
    begin
      instance.on_start if instance.respond_to?(:on_start)
    rescue => e
      Appsignal.internal_logger.error(
        "An error occurred while starting the '#{name}' loader: " \
          "#{e.class}: #{e.message}\n#{e.backtrace.join("\n")}"
      )
    end
  end
end

def unregister(name)

def unregister(name)
  loaders.delete(name)
end