aliasmgr.lua
local aliasmgr = {}
aliasmgr.__index = aliasmgr
function aliasmgr:new()
  local mgr = {
    aliases = {}
  }
  setmetatable(mgr, self)
  return mgr
end
local function argError(funcName, argument, expected, actual)
  local msg = string.format("%s: %s as %s expected, got %s", funcName, argument, expected, actual)
  printError(msg, true, true)
end
function aliasmgr:register(name, regex, func)
  local funcName = "aliasmgr:register(name, regex, func)"
  if func == nil then
    printError(f"{funcName} takes 3 arguments and you have provided less than that", true, true)
  end
  local nameType = type(name)
  if nameType ~= "string" then
    argError(funcName, "name", "string", nameType)
  end
  local regexType = type(regex)
  if regexType ~= "string" then
    argError(funcName, "regex", "string", regexType)
  end
  local funcType = type(func)
  if funcType ~= "string" and funcType ~= "function" then
    argError(funcName, "func", "string or function", funcType)
  end
  local object = {
    regex = regex,
    func = func
  }
  self:kill(name)
  local ok, err = pcall(tempAlias, regex, func)
  if not ok then
    return nil, err
  end
  object.handlerID = err
  self.aliases[name] = object
  return true
end
function aliasmgr:add(name, regex, func)
  self:register(name, regex, func)
end
function aliasmgr:disable(name)
  local funcName = "aliasmgr:disable(name)"
  local nameType = type(name)
  if nameType ~= "string" then
    argError(funcName, "name", "string", nameType)
  end
  local object = self.aliases[name]
  if not object or object.handlerID == -1 then
    return false
  end
  killAlias(object.handlerID)
  object.handlerID = -1
  return true
end
function aliasmgr:disableAll()
  local aliases = self.aliases
  for name, object in pairs(aliases) do
    self:disable(name)
  end
end
function aliasmgr:enable(name)
  local funcName = "aliasmgr:enable(name)"
  local nameType = type(name)
  if nameType ~= "string" then
    argError(funcName, "name", "string", nameType)
  end
  local object = self.aliases[name]
  if not object then
    return false
  end
  self:register(name, object.regex, object.func)
end
function aliasmgr:enableAll()
  local aliases = self.aliases
  for name,_ in pairs(aliases) do
    self:enable(name)
  end
  return true
end
function aliasmgr:kill(name)
  local funcName = "aliasmgr:kill(name)"
  local nameType = type(name)
  if nameType ~= "string" then
    argError(funcName, "name", "string", nameType)
  end
  local object = self.aliases[name]
  if not object then
    return false
  end
  self:disable(name)
  self.aliases[name] = nil
  return true
end
function aliasmgr:killAll()
  local aliases = self.aliases
  for name, _ in pairs(aliases) do
    self:kill(name)
  end
end
function aliasmgr:delete(name)
  return self:kill(name)
end
function aliasmgr:deleteAll()
  return self:killAll()
end
function aliasmgr:getAliases()
  return self.aliases
end
return aliasmgr