Mobile::Auth には認可サブがありません。
Mobile::Auth::authorize($args)
あなたが示したことを考えると、死ぬべきです。
Daxim が指摘したように、メソッド構文を使用していないため、perl のメソッド ディスパッチを呼び出していません。これを修正するには、2 つのオプションがあります。
最初の方法は、実際に必要なサブルーチンを呼び出すことです。
Site::Auth::authorize($args)
に続く
Mobile::Auth::redirect_to_login_page
ただし、この OO を実行しようとしている場合は、パッケージ メソッドを試すことができます (オブジェクト メソッドほど一般的ではありませんが、少なくとも正しいと思います)。
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);
いくつかの変更点に注意してください: Site::Auth::authorize() は $self が最初の引数であると想定するようになり、Mobile::Auth はメソッド呼び出し構文である -> 演算子を使用して authorize を呼び出すようになりました。:: と -> here の違いは大きいです。まず、-> で関数を呼び出すときは、「サブ」ではなく「メソッド」と呼びます。次に、メソッドには常に最初の引数として「$self」が渡されます。パッケージ メソッドの場合、$self はパッケージの名前を含む単なる文字列です。オブジェクトの場合、$self はオブジェクトへの参照です。3 番目に、ここで使用しようとしている OO 階層を使用してメソッドがディスパッチされます。
ここで、Mobile::Authorize は独自の redirect_to_login_page() を定義していますが、validate_credentials() または authorize() サブルーチンを定義していないことに気付くでしょう。(厳密に言えば、次のことのために validate_credentials() を除外する必要はありませんでしたが、除外する必要があるので、私はそうしました。)
それはどのように機能しますか?Mobile::Auth->authorize() はチェーンをさかのぼって Site::Auth->authorize を見つけ、それを呼び出します。Site::Auth->authorize は $self を "Mobile::Auth" として取得します。Mobile::Auth->validate_credentials を呼び出し、perl は最終的に Site::Auth->validate_credentials としてディスパッチします。次に Mobile::Auth->redirect_to_login_page を呼び出しますが、これは実際にはパッケージ Mobile::Auth で定義されているため、そこから呼び出されます。
また、http://perldoc.perl.org/perlobj.html表紙から表紙までを読む必要があります。これで、perl のオブジェクトの基本が理解できるはずです。