/**
  * Set the user type to determine which user choices will be set.
  * An exception will be thrown if this method is not called when using this field.
  *
  * @param string | Type\UserTypeInterface $type
  *
  * @return User
  */
 public function setUserType($type)
 {
     if (!is_string($type) && !$type instanceof Type\UserTypeInterface) {
         throw new \InvalidArgumentException('User type must be a string or an instance of UserTypeInterface');
     }
     $this->_type = is_string($type) ? $this->_userTypes->get($type) : $type;
     return $this;
 }
 public function getByUserID($userID)
 {
     if (!is_numeric($userID)) {
         throw new \InvalidArgumentException('User ID must be numeric');
     }
     $result = $this->_queryBuilderFactory->getQueryBuilder()->select('type')->from(self::TYPE_TABLE)->where('user_id = ?i', [$userID])->getQuery()->run();
     $type = $result->count() ? $result->value() : 'none';
     return $this->_userTypes->get($type);
 }
 /**
  * Get a new instance of Profile with the fields set up
  *
  * @param string | UserTypeInterface $type
  *
  * @return Profile
  */
 public function getProfile($type)
 {
     if (is_string($type)) {
         $type = $this->_userTypes->get($type);
     } elseif (!$type instanceof UserTypeInterface) {
         $varType = gettype($type) === 'object' ? get_class($type) : gettype($type);
         throw new \InvalidArgumentException('Type must be either a string or an instance of UserTypeInterface, ' . $varType . ' given');
     }
     $profile = new Profile($type);
     $factory = $this->_getFieldFactory();
     $factory->build($type);
     foreach ($factory as $name => $field) {
         $profile->{$name} = $field instanceof Field\Group && $field->isRepeatable() ? new Field\RepeatableContainer($field) : $field;
     }
     return $profile;
 }