rows); } return NULL; } public static function new(): self { return new self(); } public static function open(?string $filename = NULL): self { // @TODO move logic from Editor return new self(filename: $filename); } public function save(): bool { // @TODO move logic return false; } public function insertChar(Point $at, string $c): void { } public function isDirty(): bool { return $this->dirty; } public function deleteChar(Point $at): void { } private function insertNewline(Point $at): void { } }