2017-04-18 17 views
3

간단한 메서드 체이닝을 구현하고 싶습니다. 메서드가 객체를 반환해야하기 때문에. 내 코드가 이미 무스를 사용하고 있고 이후 클래스가 거의 비어 있고 다른 클래스의 인스턴스가있는 하나의 속성 만 반환하는 경우 프로그래밍 방식으로 Moose::Meta::Class (즉 Class::MOP::Class의 하위 클래스)으로 생성하기로 결정했습니다. 출력Moose :: Meta :: Class 또는 Class :: MOP :: Class를 사용하여 올바른 동적 클래스 생성

package Cat; 
use Moose; 


package Generator; 
use Moose; 

sub generate { 

    Class::MOP::Class->create(
     'Siberian' => (
      methods => { 
       echo => sub { print 'yeah!' } 
      } 
     ) 
    ); 

    Class::MOP::Class->create(
     'Tiger' => (
      attributes => [ 
       Class::MOP::Attribute->new('Siberian' => (
       default => sub { require Siberian; Siberian->new; } 
       )), 
      ], 
     ) 
    ); 

    Cat->meta->add_attribute(Class::MOP::Attribute->new(
     Tiger => (
      default => sub { require Tiger; Tiger->new } 
     ) 
    )); 

    print "Generation done!\n"; 

} 

generate(); 


package main; 
use Generator; 

my $a = Cat->new; 
warn $a->Tiger->Siberian->echo; # must print 'yeah!' but prints Can't locate object method "new" via package "Tiger" at dynamic.pl line 33 

대신 예상 yeah!을 내가

객체 메소드를 찾을 수 없습니다 "새로운"패키지를 통해 "타이거"를 참조하십시오 무스 작업을 처음 그래서 시도하는 간단한 코드를 작성 메타 클래스 at dynamic.pl line 33

무엇이 잘못 되었습니까?

답변