/**
  * Retrieves a link and associates a user (will lazily
  * create one) for the given slug, provider and token.
  *
  * @param  string  $slug
  * @param  mixed   $provider
  * @param  mixed   $token
  * @return \Cartalyst\SentrySocial\Links\LinkInterface
  */
 protected function linkLoggedOut($slug, $provider, $token)
 {
     $uid = $provider->getUserUid($token);
     $link = $this->retrieveLink($slug, $uid, $token);
     if (!($user = $link->getUser())) {
         $userProvider = $this->sentry->getUserProvider();
         $login = $provider->getUserEmail($token) ?: $uid . '@' . $slug;
         try {
             $user = $userProvider->findByLogin($login);
             $link->setUser($user);
             $this->fireEvent('existing', $link, $provider, $token, $slug);
         } catch (UserNotFoundException $e) {
             $emptyUser = $userProvider->getEmptyUser();
             // Create a dummy password for the user
             $passwordParams = array($slug, $login, time(), mt_rand());
             shuffle($passwordParams);
             // Setup an array of attributes we'll add onto
             // so we can create our user.
             $attributes = array($emptyUser->getLoginName() => $login, $emptyUser->getPasswordName() => implode('', $passwordParams));
             // Some providers give a first / last name, some don't.
             // If we only have one name, we'll just put it in the
             // "first_name" attribute.
             if (is_array($name = $provider->getUserScreenName($token))) {
                 $attributes['first_name'] = $name[0];
                 $attributes['last_name'] = $name[1];
             } elseif (is_string($name)) {
                 $attributes['first_name'] = $name;
             }
             $user = $userProvider->create($attributes);
             $user->attemptActivation($user->getActivationCode());
             $link->setUser($user);
             $this->fireEvent('registering', $link, $provider, $token, $slug);
         }
     } else {
         $this->fireEvent('existing', $link, $provider, $token, $slug);
     }
     $this->fireEvent('linking', $link, $provider, $token, $slug);
     return $link;
 }
 /**
  * Gets the user provider for Sentry.
  *
  * @return \Cartalyst\Sentry\Users\ProviderInterface 
  * @static 
  */
 public static function getUserProvider()
 {
     return \Cartalyst\Sentry\Sentry::getUserProvider();
 }