2009-11-01 13 views
5

düşünün:Sorun :: NonMoose sınıf

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; 

... 

bu edilmektedir derler çıkışı:

begin isa = $VAR1 = [ 
      'Moose::Object' 
     ]; 
runtime isa = $VAR1 = [ 
      'CGI::Application', 
      'Moose::Object' 
     ]; 

neden ilgileniyorsun? Çünkü bir CGI :: Application :: Plugin :: * sınıfına use'u denediğimde, zaten derleme zamanında CGI::Application'dan miras almam bekleniyor. Eklenti sınıfı, sınıfımda bir sınıf yöntemi olarak add_callback'u çağırmaya çalışır, ancak yapamaz, çünkü benim @ISA henüz kurulmadı.

Bunu çözmenin en iyi yolu nedir? BEGIN elkitabında @ISA kodunu elle düzeltmek MooseX::NonMoose ile çakışıyor mu? Bu olup olmadığını bilmek Moose donanımları hakkında

package MyApp::CGI; 

use Moose; 
use MooseX::NonMoose; 

use base 'CGI::Application'; 
extends 'CGI::Application'; 

Yeterince bilmiyorum (ya da bir şey gerçekten):

aşağıdaki Düzenleme çalışması için görünür, ama saldırgan buluyorum iyi bir fikir.

+5

{... uzanır} BEGIN. – jrockway

+1

(BEGIN için eşanlamlı olarak "use" kelimesinin ortak bir antipattern olduğuna dikkat edin. Ayrıca bkz .: "OK kullan ...") – jrockway

+0

jrockway: Bu bir cevap olmalı, bir yorum olmamalıdır – ysth

cevap

5

Ben bu ihtiyacınızı eksiksiz yapar çünkü korkunç korkunç olmak use base 'CGI::Application'; extends 'CGI::Application'; bulmuyorum: derleme zamanda

  • , @ISA tam CGI kullanım şartlarını karşılayan 'CGI::Application' içerir :: Uygulama :: Eklenti :: *
  • Çalışma zamanında, sınıfınız CGI::Application soyundan gelen Moose ve tüm yararları ile (sınıfınızın kompozisyonunu Moosey meta iyiliği ile tasarlayabilmenizi sağlar). Yalnızca extends 'CGI::Application' satırında, extends ifadesinin yaptığı işe dayanan herhangi bir işin (yani, sınıfınızda çağrılan yöntemlerle) karşılaşmasıyla karşılaşılır: sınıfınız Moose::Object'dan gelir ve yüklü bir meta sınıfınız vardır. Eğer ihtiyacınız olduğunda gelen planlanandan biraz tüm MOOSEY meta iyilik olsun

    BEGIN { extends 'CGI::Application' } 
    

    ... ve bu olmamalıdır: jrockway çözümü de çalışması gerektiğini belirterek,

extends tanımlamak için zaten use Moose ve use MooseX::NonMoose numaralı çağrıları yapmış olmanız koşuluyla, çizelgesini kullanın.

(Ek:. Eğer gibi Şimdi onlar BEGIN bloğunda sarılmış sanki hemen böyle çözümlenir derleme sırasında bir anahtar kelimenin ayrıştırmayı zorunlu kılma olanağına yaratma complilational karmaşıklığını durulması ediyorum mesela şey Moose.pm use compiletime qw(extends) ilan etti. Bu kesin sözdizimsel şeker güzel bir parça olurdu.)

+1

Bir BEGIN bloğunu kullanmak çalışır. ++'ya jrockaway'i verirdim ama bir cevapta yayınlamadı. :) – friedo

+1

Ether: Devel :: BeginLift bunu yapıyor. – jrockway

+0

@jrockway: ooh, oynamak için yeni oyuncak! Teşekkürler! – Ether