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 )