/**
  *
  * @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));
 }
 public function update(UpdateEventArgs $eventArgs)
 {
     //Check update permissions
     $document = $eventArgs->getDocument();
     $actions = [];
     foreach ($eventArgs->getChangeSet()->getFieldNames() as $field) {
         $actions[] = Actions::update($field);
     }
     if ($this->getAccessController()->areAllowed($actions, $eventArgs->getMetadata(), $document)->getAllowed()) {
         return;
     }
     $eventArgs->setReject(true);
     $eventArgs->getEventManager()->dispatchEvent(AccessControlEvents::UPDATE_DENIED, new EventArgs($document, 'update'));
 }
 /**
  *
  * @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));
 }