/**
  * @throws Exception
  */
 public function beforeUpdate()
 {
     if ($this->node !== null && !$this->node->getIsNewRecord()) {
         $this->node->refresh();
     }
     switch ($this->operation) {
         case self::OPERATION_MAKE_ROOT:
             if ($this->treeAttribute === false) {
                 throw new Exception('Can not move a node as the root when "treeAttribute" is false.');
             }
             if ($this->owner->isRoot()) {
                 throw new Exception('Can not move the root node as the root.');
             }
             break;
         case self::OPERATION_INSERT_BEFORE:
         case self::OPERATION_INSERT_AFTER:
             if ($this->node->isRoot()) {
                 throw new Exception('Can not move a node when the target node is root.');
             }
         case self::OPERATION_PREPEND_TO:
         case self::OPERATION_APPEND_TO:
             if ($this->node->getIsNewRecord()) {
                 throw new Exception('Can not move a node when the target node is new record.');
             }
             if ($this->owner->equals($this->node)) {
                 throw new Exception('Can not move a node when the target node is same.');
             }
             if ($this->node->isChildOf($this->owner)) {
                 throw new Exception('Can not move a node when the target node is child.');
             }
     }
 }