簡體   English   中英

MooseX :: NonMoose類中mixins的問題

[英]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 :: *的使用要求
  • 在運行時,您的類是CGI :: ApplicationMoose后代,具有所有后續的好處(能夠使用Moosey meta goodness設計您的類的組合)。 只有在遇到extends 'CGI::Application'行之后才會完成任何工作(即在你的類上調用方法),這些工作依賴於extends語句所做的工作:你的類來自Moose::Object而你安裝了一個元類。

也就是說,jrockway的解決方案也應該有效:

BEGIN { extends 'CGI::Application' }

...在你需要的時候,你可以提前獲得所有Moosey meta goodness,並且它不應該超出預定時間,前提是你已經調用了use Mooseuse MooseX::NonMoose來定義extends

(附錄:現在我正在思考創建強制在編譯時強制解析關鍵字的能力的復雜性,這些解析是立即解析的,例如它們是否包含在BEGIN塊中。例如,如果Moose.pm聲明use compiletime qw(extends) 。肯定會是一段很好的語法糖。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM