public function getVisibleUnits()
 {
     if (!in_array('units', $this->_loaded)) {
         $this->_loadUnits();
     }
     return parent::getVisibleUnits();
 }
 private function _getUnits(Product $product, array $options)
 {
     $units = [];
     $locations = $this->get('stock.locations');
     foreach ($product->getVisibleUnits() as $unit) {
         // Skip units that don't meet the options criteria, if set
         if ($options && $options !== array_intersect_assoc($options, $unit->options)) {
             continue;
         }
         if (1 > $unit->getStockForLocation($locations->getRoleLocation($locations::SELL_ROLE))) {
             $this->_outOfStock[(int) $unit->id] = $unit->id;
         }
         $units[$unit->id] = $unit;
     }
     return $units;
 }
 protected function _getAvailableUnits(Product $product, array $options = [])
 {
     $key = md5(serialize(array($product->id, $options)));
     if (!array_key_exists($key, $this->_availableUnits)) {
         $this->_availableUnits[$key] = [];
         foreach ($product->getVisibleUnits() as $unit) {
             // Skip units that don't meet the options criteria, if set
             if ($options && $options !== array_intersect_assoc($options, $unit->options)) {
                 continue;
             }
             $this->_availableUnits[$key][$unit->id] = $unit;
         }
     }
     return $this->_availableUnits[$key];
 }