local units = {};

local function set(unit, boolean)
	if boolean or boolean == nil then
		units[unit] = true;
	else
		units[unit] = nil;
	end;
end;

local function unset(unit)
	return set(unit, false);
end;

local function isSet(unit)
	return units[unit] or false;
end;

local function doPrint(unit, ...)
	if units[unit] then
		print(...);
	end;
end;

local function printf(unit, ...)
	if units[unit] then
		local success, text = pcall(string.format, ...);
		if success then
			print(text);
		else
			error(text, 2);
		end;
	end;
end;

Debug = {

	_VERSION = "1.1";

	-- Funktion set(unit, boolean)
	-- Bedeutung:	aktiviert oder deaktiviert Debugging-Ausgaben für eine Einheit
	-- unit:			die Einheit, für die das Debugging geändert werden soll
	-- boolean:		true = aktivieren, false = deaktivieren; bei nur einem Parameter wird aktiviert
	-- Rückgabe:	keine
	set = set;

	-- Funktion unset(unit)
	-- Bedeutung:	deaktiviert Debugging-Ausgaben für die übergebene Einheit
	-- unit:			die Einheit, für die das Debugging deaktiviert werden soll
	-- Rückgabe:	keine
	unset = unset;

	-- Funktion isSet(unit)
	-- Bedeutung:	prüft, ob für diese Einheit Debugging-Ausgaben aktiviert sind
	-- unit:			zu prüfende Einheit
	-- Rückgabe:	true, wenn aktiviert, sonst false
	isSet = isSet;

	-- Funktion print(unit, ...)
	-- Bedeutung:	gibt die variablen Argumente aus, wenn unit aktiviert ist
	-- unit:			Einheit
	-- ...:       werden an die System-Funktion print(...) übergeben
	-- Rückgabe:	keine
	print = doPrint;

	-- Funktion printf(unit, ...)
	-- Bedeutung:	erzeugt eine Debugging-Ausgabe, wenn unit aktiviert ist
	-- unit:			Einheit
	-- ...:       alle übrigen Argumente werden an string.format(...) übergeben, und das Ergebnis wird ausgegeben
	-- Rückgabe:	keine
	printf = printf;

}

print("Debug Version " .. Debug._VERSION);

return Debug;
