/**
  * Find a preference by it's key
  * or return a new instance.
  *
  * @param $key
  * @return PreferenceInterface
  */
 public function findByKeyOrNew($key)
 {
     /* @var UserInterface $user */
     if (!($user = $this->auth->getUser())) {
         throw new \Exception('The user could not be determined.');
     }
     if (!($preference = $this->model->where('key', $key)->where('user_id', $user->getId())->first())) {
         $preference = $this->model->newInstance();
         $preference->setKey($key);
         $preference->setUser($user);
     }
     return $preference;
 }
 /**
  * Set a preference value.
  *
  * @param $key
  * @param $value
  * @return $this
  */
 public function set($key, $value)
 {
     $preference = $this->model->where('user_id', $this->auth->id())->where('key', $key)->first();
     if (!$preference) {
         $preference = $this->model->newInstance();
         $preference->user_id = $this->auth->id();
         $preference->key = $key;
     }
     if (!($field = config(str_replace('::', '::preferences/preferences.', $key)))) {
         $field = config(str_replace('::', '::preferences.', $key));
     }
     if (is_string($field)) {
         $field = ['type' => $field];
     }
     $type = app(array_get($field, 'type'));
     $modifier = $type->getModifier();
     if ($modifier instanceof FieldTypeModifier) {
         $value = $modifier->modify($value);
     }
     $preference->value = $value;
     $preference->save();
     return $this;
 }