module Asciidoctor::Converter::DefaultFactory

def catch_all

def catch_all
  @@catch_all
end

def for backend

def for backend
  @@registry.fetch backend do
    PROVIDED[backend] ? (@@mutex.synchronize do
      # require is thread-safe, so no reason to refetch
      require PROVIDED[backend]
      @@registry[backend]
    end) : catch_all
  end
end

def register converter, *backends

def register converter, *backends
  if @@mutex.owned?
    backends.each {|backend| backend == '*' ? (@@catch_all = converter) : (@@registry = @@registry.merge backend => converter) }
  else
    @@mutex.synchronize { register converter, *backends }
  end
end

def registry

def registry
  @@registry
end

def unregister_all

def unregister_all
  @@mutex.synchronize do
    @@registry = @@registry.select {|backend| PROVIDED[backend] }
    @@catch_all = nil
  end
end