/**
  * @since 0.2
  *
  * @param Snak $mainSnak
  * @param EntityId|Item|Property|string $target
  * @param EditInfo|null $editInfo
  *
  * @return string the GUID of the claim
  * @throws UnexpectedValueException
  */
 public function create(Snak $mainSnak, $target, EditInfo $editInfo = null)
 {
     if (is_string($target)) {
         $entityId = $target;
     } elseif ($target instanceof EntityId) {
         $entityId = $target->getSerialization();
     } elseif ($target instanceof Item || $target instanceof Property) {
         $entityId = $target->getId()->getSerialization();
     } else {
         throw new UnexpectedValueException('$target needs to be an EntityId, Entity or string');
     }
     $params = array('entity' => $entityId, 'snaktype' => $mainSnak->getType(), 'property' => $mainSnak->getPropertyId()->getSerialization());
     if ($mainSnak instanceof PropertyValueSnak) {
         $serializedDataValue = $this->dataValueSerializer->serialize($mainSnak->getDataValue());
         $params['value'] = json_encode($serializedDataValue['value']);
     }
     $result = $this->api->postRequest('wbcreateclaim', $params, $editInfo);
     return $result['claims']['id'];
 }