/**
  * finds a user from storage based on ID and returns a User object located
  * in memory. Normally this kind of logic will be implemented using the Repository pattern.
  * However the important part is in mapRowToUser() below, that will create a business object from the
  * data fetched from storage
  *
  * @param int $id
  *
  * @return User
  */
 public function findById(int $id) : User
 {
     $result = $this->adapter->find($id);
     if ($result === null) {
         throw new \InvalidArgumentException("User #{$id} not found");
     }
     return $this->mapRowToUser($result);
 }