identifier = $identifier; self::$current = $this; } public static function getModule(): ?Page { return self::$current; } public function getIdentifier(): string { return $this->identifier ?: static::class; } public function preprocess(): void { $this->doPreprocess(); } public function render(): void { $this->doRender(); } // Methods the module is expected to implement abstract protected function doPreprocess(); abstract protected function doRender(); }