setCapacitor($capacitor); } /** @var ICapacitor */ protected $capacitor; function setCapacitor(?ICapacitor $capacitor): self { if ($capacitor === null) $capacitor = new Capacitor(); $this->capacitor = $capacitor; $this->setupCapacitor = true; return $this; } /** @var string|null */ protected $channel; function setChannel(?string $channel): self { $this->channel = $channel; return $this; } protected function _setupCapacitor(): void { } /** @var bool */ protected $setupCapacitor; protected function capacitor(): ICapacitor { if ($this->setupCapacitor) { $this->_setupCapacitor(); $this->setupCapacitor = false; } return $this->capacitor; } function cook($item) { $this->capacitor()->charge($item, $this->channel); } function getItem($pkvalues, ?string $channel=null) { if ($channel === null) $channel = $this->channel; return $this->capacitor()->getItem($pkvalues, $channel); } function discharge(bool $remove=true, ?string $channel=null): iterable { if ($channel === null) $channel = $this->channel; return $this->capacitor()->discharge($channel, $remove); } }