/**
  * Move to another parent CategoryItem
  *
  * @param CategoryItem $item   item object
  * @param CategoryItem $parent new parent item object
  * @return CategoryItem
  * @throws UnableMoveToSelfException
  */
 public function moveTo(CategoryItem $item, CategoryItem $parent = null)
 {
     $oldParent = $item->getParent();
     if ($parent !== null) {
         if ($item->getKey() === $parent->getKey()) {
             throw new UnableMoveToSelfException();
         }
         if ($oldParent !== null && $oldParent->getKey() == $parent->getKey()) {
             return;
         }
     }
     if ($oldParent !== null) {
         $this->unlinkHierarchy($item, $oldParent);
         $item->{$item->getParentIdName()} = null;
     }
     if ($parent !== null) {
         $this->linkHierarchy($item, $parent);
         $item->{$item->getParentIdName()} = $parent->getKey();
     }
     $item->save();
     // 연관 객체 정보들이 변경 되었으므로 객채를 갱신 함
     return $item->newQuery()->find($item->getKey());
 }