/**
  * {@inheritdoc}
  */
 public function decrease($inventoryUnits)
 {
     if (!is_array($inventoryUnits) && !$inventoryUnits instanceof Collection) {
         throw new \InvalidArgumentException('Inventory units value must be array or instance of "Doctrine\\Common\\Collections\\Collection".');
     }
     $quantity = count($inventoryUnits);
     if ($quantity < 1) {
         throw new \InvalidArgumentException('Quantity of units must be greater than 0.');
     }
     if ($inventoryUnits instanceof Collection) {
         $stockable = $inventoryUnits->first()->getStockable();
     } else {
         $stockable = $inventoryUnits[0]->getStockable();
     }
     if (!$this->availabilityChecker->isStockSufficient($stockable, $quantity)) {
         throw new InsufficientStockException($stockable, $quantity);
     }
     $this->eventDispatcher->dispatch(SyliusStockableEvents::PRE_DECREASE, new GenericEvent($stockable));
     $this->backordersHandler->processBackorders($inventoryUnits);
     $onHand = $stockable->getOnHand();
     foreach ($inventoryUnits as $inventoryUnit) {
         if (InventoryUnitInterface::STATE_SOLD === $inventoryUnit->getInventoryState()) {
             --$onHand;
         }
     }
     $stockable->setOnHand($onHand);
     $this->eventDispatcher->dispatch(SyliusStockableEvents::POST_DECREASE, new GenericEvent($stockable));
 }
 /**
  * {@inheritdoc}
  *
  * Fills backorders using backorders handler.
  *
  * @param GenericEvent $event
  */
 public function onInventoryChange(GenericEvent $event)
 {
     $this->backordersHandler->fillBackorders($event->getSubject());
 }