/**
  * Set reference data into the product value
  *
  * @param AttributeInterface          $attribute
  * @param ProductInterface            $product
  * @param ReferenceDataInterface|null $referenceData
  * @param string|null                 $locale
  * @param string|null                 $scope
  *
  * @throws \LogicException
  */
 protected function setReferenceData(AttributeInterface $attribute, ProductInterface $product, $referenceData = null, $locale = null, $scope = null)
 {
     $value = $product->getValue($attribute->getCode(), $locale, $scope);
     if (null === $value) {
         $value = $this->productBuilder->addProductValue($product, $attribute, $locale, $scope);
     }
     $setMethod = MethodNameGuesser::guess('set', $attribute->getReferenceDataName(), true);
     if (!method_exists($value, $setMethod)) {
         throw new \LogicException(sprintf('ProductValue method "%s" is not implemented', $setMethod));
     }
     $value->{$setMethod}($referenceData);
 }
 /**
  * @param ReferenceDataInterface $referenceData
  * @param bool                   $fallbackOnCode
  *
  * @return string|null
  */
 public function render(ReferenceDataInterface $referenceData, $fallbackOnCode = true)
 {
     if (null !== ($labelProperty = $referenceData::getLabelProperty())) {
         $getter = MethodNameGuesser::guess('get', $labelProperty);
         $label = $referenceData->{$getter}();
         if (!empty($label)) {
             return $label;
         }
     }
     if ($fallbackOnCode) {
         return sprintf('[%s]', $referenceData->getCode());
     }
     return null;
 }
 /**
  * @param string $referenceData
  *
  * @return array
  */
 protected function getRequiredAccessorForMultipleReferenceData($referenceData)
 {
     $accessors = [];
     $accessors[] = MethodNameGuesser::guess('add', $referenceData, true);
     $accessors[] = MethodNameGuesser::guess('remove', $referenceData, true);
     return $accessors;
 }
 /**
  * Set reference data collection into the product value
  *
  * @param AttributeInterface $attribute
  * @param ProductInterface   $product
  * @param array              $referenceDataCollection
  * @param string|null        $locale
  * @param string|null        $scope
  *
  * @throws \LogicException
  */
 protected function setReferenceDataCollection(AttributeInterface $attribute, ProductInterface $product, array $referenceDataCollection, $locale = null, $scope = null)
 {
     $value = $product->getValue($attribute->getCode(), $locale, $scope);
     if (null === $value) {
         $value = $this->productBuilder->addProductValue($product, $attribute, $locale, $scope);
     }
     $referenceDataName = $attribute->getReferenceDataName();
     $addMethod = MethodNameGuesser::guess('add', $referenceDataName, true);
     $removeMethod = MethodNameGuesser::guess('remove', $referenceDataName, true);
     $getMethod = MethodNameGuesser::guess('get', $referenceDataName);
     if (!method_exists($value, $addMethod) || !method_exists($value, $removeMethod) || !method_exists($value, $getMethod)) {
         throw new \LogicException(sprintf('One of these methods is not implemented in %s: "%s", "%s", "%s"', ClassUtils::getClass($value), $addMethod, $removeMethod, $getMethod));
     }
     $currentCollection = $value->{$getMethod}();
     foreach ($currentCollection as $currentReferenceData) {
         $value->{$removeMethod}($currentReferenceData);
     }
     foreach ($referenceDataCollection as $referenceData) {
         $value->{$addMethod}($referenceData);
     }
 }
 /**
  * @param ProductValueInterface $value
  * @param AttributeInterface    $attribute
  * @param string                $type
  *
  * @return string
  */
 private function getValueMethodName(ProductValueInterface $value, AttributeInterface $attribute, $type)
 {
     $method = MethodNameGuesser::guess($type, $attribute->getReferenceDataName(), true);
     if (!method_exists($value, $method)) {
         throw new \LogicException(sprintf('ProductValue method "%s" is not implemented', $method));
     }
     return $method;
 }