completed = false; $this->target = null; $this->prepare(); } protected abstract function prepare() : void; protected function complete() : void { $this->completed = true; } public function get() : mixed { return $this->target; } public function is_complete() : bool { return $this->target !== null and $this->completed; } protected bool $completed; protected mixed $target; }