MojoX-Authentication

 view release on metacpan or  search on metacpan

lib/MojoX/Authentication/Model.pm  view on Meta::CPAN

         name => $name,
         provider => $provider,
      };
      push @by_sequence, $item;
      $by_name{$name} = $provider if defined($name);
      push @unnamed, $item unless defined($name);
   }

   # give 'em all a name
   my $n = 0;
   ITEM:
   for my $item (@unnamed) {
      while ('necessary') {
         my $name = 'unnamed-' . $n++;
         next if exists($by_name{$name});
         $item->{name} = $name;
         $by_name{$name} = $item->{provider};
         next ITEM;
      }
   }

   return {
      sequence => \@by_sequence,
      by_name  => \%by_name,
   };
}

sub provider_named ($self, $name) {
   return $self->_providers->{by_name}{$name} // undef;
}

# iterate a call over providers, in the order they were set upon
# construction. Stop when one of them handles the call.
sub _iterate ($self, $method_name, @args) {
   $method_name ||= (caller(1))[3] =~ s{\A .* ::}{}rmxs;
   for my $item ($self->_providers->{sequence}->@*) {
      my $provider = $item->{provider};
      my $method = $provider->can($method_name) or next;
      my $retval = $provider->$method(@args);
      next unless defined($retval);
      return ($retval, $item->{name}) if defined($retval);
   }
   return;
}

sub provider_name_for ($self, $controller, $username) {
   my (undef, $provider_name) =
      $self->_iterate(handles_username => $controller, $username);
   return $provider_name;
}

sub load_user ($self, $app, $uid) {
   my ($user, $provider_name) = $self->_iterate(undef, $app, $uid);
   return {
      provider => $provider_name,
      uid      => $uid,
      data     => $user,
   };
}

sub validate_user ($self, $ctr, $username, $secret, $extra) {
   my ($uid) = $self->_iterate(undef, $ctr, $username, $secret, $extra);
   return $uid if defined($uid);
   return;
}

1;



( run in 0.509 second using v1.01-cache-2.11-cpan-0b5f733616e )