backingInventory->getListeners()->add($this->inventoryListener = new CallbackInventoryListener( static function(Inventory $unused, int $slot, Item $oldItem) use ($weakThis) : void{ if(($strongThis = $weakThis->get()) !== null){ $strongThis->backingInventoryChanging = true; try{ $strongThis->onSlotChange($slot, $oldItem); }finally{ $strongThis->backingInventoryChanging = false; } } }, static function(Inventory $unused, array $oldContents) use ($weakThis) : void{ if(($strongThis = $weakThis->get()) !== null){ $strongThis->backingInventoryChanging = true; try{ $strongThis->onContentChange($oldContents); }finally{ $strongThis->backingInventoryChanging = false; } } } )); } public function __destruct(){ $this->backingInventory->getListeners()->remove($this->inventoryListener); } public function getSize() : int{ return $this->backingInventory->getSize(); } public function getItem(int $index) : Item{ return $this->backingInventory->getItem($index); } protected function internalSetItem(int $index, Item $item) : void{ $this->backingInventory->setItem($index, $item); } public function getContents(bool $includeEmpty = false) : array{ return $this->backingInventory->getContents($includeEmpty); } protected function internalSetContents(array $items) : void{ $this->backingInventory->setContents($items); } public function isSlotEmpty(int $index) : bool{ return $this->backingInventory->isSlotEmpty($index); } protected function onSlotChange(int $index, Item $before) : void{ if($this->backingInventoryChanging){ parent::onSlotChange($index, $before); } } protected function onContentChange(array $itemsBefore) : void{ if($this->backingInventoryChanging){ parent::onContentChange($itemsBefore); } } }