/**
  *
  * @param \Zoop\Shard\Annotation\AnnotationEventArgs $eventArgs
  */
 public function annotationChainValidator(AnnotationEventArgs $eventArgs)
 {
     $annotation = $eventArgs->getAnnotation();
     $eventManager = $eventArgs->getEventManager();
     $type = $eventArgs->getEventType();
     $reflection = $eventArgs->getReflection();
     $metadata = $eventArgs->getMetadata();
     $validators = [];
     foreach ($annotation->value as $validatorAnnotation) {
         $validatorEventArgs = new AnnotationEventArgs($metadata, $type, $validatorAnnotation, $reflection, $eventManager);
         $eventManager->dispatchEvent($validatorAnnotation::EVENT, $validatorEventArgs);
         $validatorMetadata = $this->getValidatorMetadata($metadata);
         if ($type == EventType::DOCUMENT && isset($validatorMetadata['document'])) {
             $validators[] = $validatorMetadata['document'];
         } elseif (isset($validatorMetadata['fields'][$reflection->getName()])) {
             $validators[] = $validatorMetadata['fields'][$reflection->getName()];
         }
     }
     if (count($validators) == 0) {
         $validator = null;
     } elseif (count($validators) == 1) {
         $validator = $validators[0];
     } elseif (count($validators) > 1) {
         $validator = ['class' => $annotation->class, 'options' => ['validators' => $validators]];
     }
     if ($type == EventType::DOCUMENT) {
         $this->setDocumentValidator($eventArgs, $validator);
     } else {
         $this->setFieldValidator($eventArgs, $validator);
     }
 }
 /**
  *
  * @param \Zoop\Shard\Annotation\AnnotationEventArgs $eventArgs
  */
 public function annotationState(AnnotationEventArgs $eventArgs)
 {
     $field = $eventArgs->getReflection()->getName();
     $metadata = $eventArgs->getMetadata();
     $eventManager = $eventArgs->getEventManager();
     $metadata->addProperty('state', true);
     $metadata->setState([$field => $eventArgs->getAnnotation()->value]);
     //Add sythentic annotation to create extra permission that will allow
     //updates on the state field when access control is enabled.
     $permissionAnnotation = new Shard\Permission\Basic(['roles' => BasicPermission::WILD, 'allow' => Actions::update($field)]);
     // Raise annotation event
     $eventManager->dispatchEvent($permissionAnnotation::EVENT, new AnnotationEventArgs($metadata, EventType::DOCUMENT, $permissionAnnotation, $metadata->getReflectionClass(), $eventManager));
 }
 /**
  *
  * @param \Zoop\Shard\Annotation\AnnotationEventArgs $eventArgs
  */
 public function annotationFreeze(AnnotationEventArgs $eventArgs)
 {
     $field = $eventArgs->getReflection()->getName();
     $metadata = $eventArgs->getMetadata();
     $eventManager = $eventArgs->getEventManager();
     $freezeMetadata = $this->getFreezeMetadata($metadata);
     $freezeMetadata['flag'] = $field;
     $metadata->setFreeze($freezeMetadata);
     //Add sythentic annotation to create extra permission that will allow
     //updates on the freeze field when access control is enabled.
     $permissionAnnotation = new Shard\Permission\Basic(['roles' => BasicPermission::WILD, 'allow' => Actions::update($field)]);
     // Raise annotation event
     $eventManager->dispatchEvent($permissionAnnotation::EVENT, new AnnotationEventArgs($metadata, EventType::DOCUMENT, $permissionAnnotation, $metadata->getReflectionClass(), $eventManager));
 }
 /**
  *
  * @param \Zoop\Shard\Annotation\AnnotationEventArgs $eventArgs
  */
 public function annotationAccessControl(AnnotationEventArgs $eventArgs)
 {
     $annotation = $eventArgs->getAnnotation();
     $metadata = $eventArgs->getMetadata();
     if ($annotation->value) {
         $eventManager = $eventArgs->getEventManager();
         foreach ($annotation->value as $permissionAnnotation) {
             if (defined(get_class($permissionAnnotation) . '::EVENT')) {
                 // Raise annotation event
                 $eventManager->dispatchEvent($permissionAnnotation::EVENT, new AnnotationEventArgs($metadata, EventType::DOCUMENT, $permissionAnnotation, $eventArgs->getReflection(), $eventManager));
             }
         }
     }
 }