[英]Problem with mixins in a MooseX::NonMoose class
考慮以下:
package MyApp::CGI;
use Moose;
use MooseX::NonMoose;
use Data::Dumper;
extends 'CGI::Application';
BEGIN {
print "begin isa = " . Dumper \@MyApp::CGI::ISA;
};
print "runtime isa = " . Dumper \@MyApp::CGI::ISA;
...
編譯時的輸出是:
begin isa = $VAR1 = [
'Moose::Object'
];
runtime isa = $VAR1 = [
'CGI::Application',
'Moose::Object'
];
我為什么在意? 因為當我嘗試use
CGI :: Application :: Plugin :: *類時,它希望我在編譯時繼承CGI::Application
。 插件類試圖在我的類上調用add_callback
作為類方法,但不能,因為我的@ISA
尚未設置。
解決這個問題的最佳方法是什么? 在BEGIN
塊中手動調整@ISA
會干擾MooseX::NonMoose
嗎?
編輯
以下似乎有效,但我發現它令人反感:
package MyApp::CGI;
use Moose;
use MooseX::NonMoose;
use base 'CGI::Application';
extends 'CGI::Application';
關於Moose內部人員我不知道(或任何事情,真的)知道這是不是一個好主意。
我找不到use base 'CGI::Application'; extends 'CGI::Application';
use base 'CGI::Application'; extends 'CGI::Application';
非常可怕,因為它完全符合你的需要:
@ISA
包含'CGI::Application'
,它完全滿足CGI :: Application :: Plugin :: *的使用要求 extends 'CGI::Application'
行之后才會完成任何工作(即在你的類上調用方法),這些工作依賴於extends
語句所做的工作:你的類來自Moose::Object
而你安裝了一個元類。 也就是說,jrockway的解決方案也應該有效:
BEGIN { extends 'CGI::Application' }
...在你需要的時候,你可以提前獲得所有Moosey meta goodness,並且它不應該超出預定時間,前提是你已經調用了use Moose
並use MooseX::NonMoose
來定義extends
。
(附錄:現在我正在思考創建強制在編譯時強制解析關鍵字的能力的復雜性,這些解析是立即解析的,例如它們是否包含在BEGIN
塊中。例如,如果Moose.pm聲明use compiletime qw(extends)
。肯定會是一段很好的語法糖。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.