constructor() {
		/** @type {StatsPrintHooks} */
		this.hooks = Object.freeze({
			sortElements: new HookMap(
				() => new SyncBailHook(["elements", "context"])
			),
			printElements: new HookMap(
				() => new SyncBailHook(["printedElements", "context"])
			),
			sortItems: new HookMap(() => new SyncBailHook(["items", "context"])),
			getItemName: new HookMap(() => new SyncBailHook(["item", "context"])),
			printItems: new HookMap(
				() => new SyncBailHook(["printedItems", "context"])
			),
			print: new HookMap(() => new SyncBailHook(["object", "context"])),
			result: new HookMap(() => new SyncWaterfallHook(["result", "context"]))
		});
		/**
		 * @type {TODO}
		 */
		this._levelHookCache = new Map();
		this._inPrint = false;
	}
@typedef {object} StatsPrintHooks
@property {HookMap<SyncBailHook<[string[], StatsPrinterContext], void>>} sortElements
@property {HookMap<SyncBailHook<[PrintedElement[], StatsPrinterContext], string | undefined | void>>} printElements
@property {HookMap<SyncBailHook<[PrintObject[], StatsPrinterContext], boolean | void>>} sortItems
@property {HookMap<SyncBailHook<[PrintObject, StatsPrinterContext], string | void>>} getItemName
@property {HookMap<SyncBailHook<[string[], StatsPrinterContext], string | undefined>>} printItems
@property {HookMap<SyncBailHook<[PrintObject, StatsPrinterContext], string | undefined | void>>} print
@property {HookMap<SyncWaterfallHook<[string, StatsPrinterContext]>>} result