mobile :: Auth ne dispose pas d'autoriser des sous.
Mobile::Auth::authorize($args)
devrait mourir, compte tenu de ce que vous avez montré. Comme Daxim l'a fait remarquer, vous n'utilisez pas la syntaxe de la méthode, et par conséquent, vous n'appelez pas la répartition des méthodes de Perl. Vous avez deux options pour résoudre ce problème.
La première est d'appeler le sous que vous voulez réellement, ce qui est
Site::Auth::authorize($args)
suivie
Mobile::Auth::redirect_to_login_page
Cependant, si vous essayez de le faire OO, et je pense vous êtes, vous pouvez essayer des méthodes de paquet (qui sont moins courantes que les méthodes d'objet, mais au moins correctes):
package Site::Auth;
#....
sub authorize {
my ($self, @args) = @_;
my $authorized = $self->validate_credentials(@args);
if(!$authorized) {
$self->redirect_to_login_page(@args);
}
}
sub redirect_to_login_page{
my ($self, @args) = @_;
# redirect to the login page
}
sub validate_credentials {
my ($self, @args) = @_;
# This is what you had in #..... before
return $authorized
}
1;
package Mobile:Auth;
use base 'Site::Auth';
sub redirect_to_login_page {
my ($self, @args) = @_;
#...
}
1;
### in Mason
use Mobile::Auth;
Mobile::Auth->authorize($args);
Veuillez noter quelques modifications: Site :: Auth :: authorize() s'attend maintenant à ce que $ self soit le premier argument, et Mobile :: Auth appelle maintenant authorize avec l'opérateur ->, qui est la syntaxe d'invocation de la méthode. La différence entre :: et -> est ici grande. Tout d'abord, lorsque vous appelez une fonction avec ->, nous l'appelons une "méthode" au lieu d'une "sous". Deuxièmement, la méthode est toujours passée "$ self" comme premier argument. Dans le cas d'une méthode de package, $ self est juste une chaîne contenant le nom du paquet. Dans le cas d'un objet, $ self est une référence à l'objet. Troisièmement, les méthodes sont distribuées en utilisant la hiérarchie OO que vous essayez d'utiliser ici.
Maintenant, vous remarquerez que Mobile :: Authorize définit son propre redirect_to_login_page() mais ne définit pas un sous-attribut validate_credentials() ou authorize(). (À proprement parler, vous ne pas tenir compte des validate_credentials() pour ce qui suit, mais vous devriez, si je l'ai fait.)
Comment ça marche? Mobile :: Auth-> authorize() parcourt la chaîne jusqu'à ce qu'il trouve Site :: Auth-> authorize, puis l'appelle. Site :: Auth-> authorize obtient $ self en tant que "Mobile :: Auth". Il appelle Mobile :: Auth-> validate_credentials, que perl distribue finalement en tant que Site :: Auth-> validate_credentials. Il appelle ensuite Mobile :: Auth-> redirect_to_login_page, qui est en fait défini dans le paquet Mobile :: Auth, de sorte qu'il est appelé à partir de là.
Aussi, vous vraiment besoin de lire http://perldoc.perl.org/perlobj.html de couverture à la couverture. Cela devrait vous donner les bases sur les objets en Perl.
Ce code est sérieusement regardé pour ce que vous essayez de faire. Les fonctions OO de Perl comme [SUPER] (http://perldoc.perl.org/perlbot.html#OVERRIDING-SUPERCLASS-METHODS) fonctionnent sur les invocations de méthodes, pas sur les appels de fonctions procédurales. Vous devez redessiner ceci. – daxim