/**
  * Adds a new Language object from the given params
  *
  * @param  array      $values
  * @throws \Exception
  * @return boolean
  * @api
  */
 protected function add(array $values)
 {
     $values = $this->dispatchBeforeOperationEvent('\\RedKiteLabs\\RedKiteCms\\RedKiteCmsBundle\\Core\\Event\\Content\\Language\\BeforeLanguageAddingEvent', LanguageEvents::BEFORE_ADD_LANGUAGE, $values, array('message' => 'exception_language_adding_aborted', 'domain' => 'exceptions'));
     try {
         $this->validator->checkEmptyParams($values);
         $this->validator->checkRequiredParamsExists(array('LanguageName' => ''), $values);
         if ($this->validator->languageExists($values['LanguageName'])) {
             throw new LanguageException\LanguageExistsException('exception_language_already_exists');
         }
         if (empty($values['LanguageName'])) {
             throw new General\ArgumentIsEmptyException('exception_null_language_name');
         }
         $result = true;
         $this->languageRepository->startTransaction();
         $hasLanguages = $this->validator->hasLanguages();
         $values['MainLanguage'] = $hasLanguages ? isset($values['MainLanguage']) ? $values['MainLanguage'] : 0 : 1;
         if ($values['MainLanguage'] == 1 && $hasLanguages) {
             $result = $this->resetMain();
         }
         if ($result) {
             // Saves the language
             if (null === $this->alLanguage) {
                 $className = $this->languageRepository->getRepositoryObjectClassName();
                 $this->alLanguage = new $className();
             }
             $values = $this->checkCreatedAt($values);
             $result = $this->languageRepository->setRepositoryObject($this->alLanguage)->save($values);
             if (false !== $result) {
                 $eventName = LanguageEvents::BEFORE_ADD_LANGUAGE_COMMIT;
                 $result = !$this->eventsHandler->createEvent($eventName, '\\RedKiteLabs\\RedKiteCms\\RedKiteCmsBundle\\Core\\Event\\Content\\Language\\BeforeAddLanguageCommitEvent', array($this, $values))->dispatch()->getEvent($eventName)->isAborted();
             }
         }
         if (false !== $result) {
             $this->languageRepository->commit();
             $this->eventsHandler->createEvent(LanguageEvents::AFTER_ADD_LANGUAGE, '\\RedKiteLabs\\RedKiteCms\\RedKiteCmsBundle\\Core\\Event\\Content\\Language\\AfterLanguageAddedEvent', array($this))->dispatch();
             return $result;
         }
         $this->languageRepository->rollBack();
         return $result;
     } catch (\Exception $e) {
         if (isset($this->languageRepository) && $this->languageRepository !== null) {
             $this->languageRepository->rollBack();
         }
         throw $e;
     }
 }