간단한 메서드 체이닝을 구현하고 싶습니다. 메서드가 객체를 반환해야하기 때문에. 내 코드가 이미 무스를 사용하고 있고 이후 클래스가 거의 비어 있고 다른 클래스의 인스턴스가있는 하나의 속성 만 반환하는 경우 프로그래밍 방식으로 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
무엇이 잘못 되었습니까?
위대한 Akzan 코드가 작동합니다! –