public function create(ConditionModel $conditionModel)
 {
     $eventDispatcher = $this->getEventDispatcher();
     $event = new CreateConditionEvent($conditionModel);
     $eventDispatcher->dispatch(EVENT_XNAVIGATION_CREATE_CONDITION, $event);
     if ($event->getCondition()) {
         return $event->getCondition();
     }
     $row = $conditionModel->row();
     $type = $conditionModel->type;
     $className = $this->getConditionClassName($type);
     $class = new \ReflectionClass($className);
     $condition = $class->newInstance();
     $rgxp = '~^' . preg_quote($type, '~') . '_(.*)$~';
     foreach ($row as $key => $value) {
         if ($value && preg_match($rgxp, $key, $matches)) {
             $property = $matches[1];
             $property = explode('_', $property);
             $property = array_map('ucfirst', $property);
             $property = implode('', $property);
             $setterName = 'set' . $property;
             if ($class->hasMethod($setterName)) {
                 $setter = $class->getMethod($setterName);
                 $parameters = $setter->getParameters();
                 if (count($parameters)) {
                     $firstParameter = $parameters[0];
                     // unserialize magic
                     if ($firstParameter->isArray()) {
                         $value = deserialize($value, true);
                     }
                     $setter->invoke($condition, $value);
                 }
             }
         }
     }
     if ($condition instanceof ChainConditionInterface) {
         $childConditionCollection = ConditionModel::findBy('pid', $conditionModel->id, array('order' => 'sorting'));
         if ($childConditionCollection) {
             while ($childConditionCollection->next()) {
                 $childCondition = $this->create($childConditionCollection->current());
                 $condition->addCondition($childCondition);
             }
         }
     }
     if ($condition instanceof ParentCondition) {
         $childConditionCollection = ConditionModel::findBy('pid', $conditionModel->id, array('order' => 'sorting'));
         if ($childConditionCollection && $childConditionCollection->next()) {
             $childCondition = $this->create($childConditionCollection->current());
             $condition->setCondition($childCondition);
         }
     }
     if ($conditionModel->invert) {
         $condition = new NotCondition($condition);
     }
     return $condition;
 }