/**
  * Find or create a member from the given resource owner ("user")
  *
  * @todo Implement $overwriteExisting. Could use priorities? I.e. Facebook data > Google data
  * @param ResourceOwnerInterface $user
  * @param string $providerName
  * @return Member
  * @throws TokenlessUserExistsException
  */
 protected function memberFromResourceOwner(ResourceOwnerInterface $user, $providerName)
 {
     $member = Member::get()->filter(['Email' => $user->getEmail()])->first();
     if (!$member) {
         $member = Member::create();
     }
     if ($member->isInDB() && !$member->AccessTokens()->count()) {
         throw new TokenlessUserExistsException('A user with the email address linked to this account already exists.');
     }
     $overwriteExisting = false;
     // @todo
     if ($overwriteExisting || !$member->isInDB()) {
         $member = $this->getMapper($providerName)->map($member, $user);
         $member->write();
     }
     return $member;
 }
 /**
  * {@inheritdoc}
  */
 protected function getIdentification(ResourceOwnerInterface $resourceOwner)
 {
     return ['email' => $resourceOwner->getEmail()];
 }
 /**
  * Add an OAuth2 client data
  *
  * @param string                 $provider
  * @param ResourceOwnerInterface $resourceOwner
  *
  * @return Profile
  */
 public static function createFromResourceOwner($provider, ResourceOwnerInterface $resourceOwner)
 {
     $classname = get_called_class();
     $class = new $classname();
     $class->provider = $provider;
     $class->uid = $resourceOwner->getId();
     $class->nickname = $resourceOwner->getNickname();
     $class->name = $resourceOwner->getName();
     $class->firstName = $resourceOwner->getFirstName();
     $class->lastName = $resourceOwner->getLastName();
     $class->email = $resourceOwner->getEmail();
     $class->imageUrl = $resourceOwner->getImageurl();
     $class->urls = $resourceOwner->getUrl();
     return $class;
 }