public function save()
 {
     $elements = $this->getElements();
     $model = AbstractModel::get($this->getName());
     $primary = $model->primary();
     $metadata = $model->getTable()->info('metadata');
     $edit = false;
     $values = array();
     foreach ($elements as $element) {
         $id = $element->getName();
         $value = method_exists($element, 'getDbValue') ? $element->getDbValue() : $element->getValue();
         if (in_array($id, $primary) && $value) {
             $edit = $value;
         } else {
             if ($value) {
                 $values[$id] = $value;
             } elseif (isset($metadata[$id])) {
                 $values[$id] = $metadata[$id]['DEFAULT'];
             }
         }
     }
     if ($edit) {
         $model = $model->getTable()->findOneById($edit);
     }
     try {
         $model->setFromArray($values);
         return $model->save();
     } catch (Exception $e) {
         die($e->getMessage());
     }
 }