저는 Perl을 무스와 함께 사용하고 있으며 추상 클래스의 인스턴스화를 방지해야합니다.무스 추상 클래스의 인스턴스화 방지
프로젝트가 상당히 발전된 단계 - Moose::Role
또는 MooseX::*
의 경우 너무 늦었습니다.
클래스 이름과 비교하여 BUILDARGS
, 의 패키지 이름을 확인하고 일치하는 항목이있는 경우 die
을 호출하려고합니다.
이 접근 방식에 문제가 있습니까?
package Foo::Abstract {
use Moose;
has 'test' => (isa => 'Int', is => 'rw', default => '0');
around BUILDARGS => sub {
die if $_[1] eq __PACKAGE__;
$orig = shift;
$class = shift;
$class->$orig(@_);
};
no Moose;
}
package Foo::Concrete {
use Moose;
extends 'Foo::Abstract';
no Moose;
}
use Test::More;
use Test::Exception;
dies_ok { Foo::Abstract->new() } "cannot instantiate. OK";
my $c;
lives_ok { $c = Foo::Concrete->new() } "instantiated Foo::Concrete. OK";
ok(0 == $c->test);
done_testing();
이 문제를 해결하는 방법은 역할입니다. – AKHolland
"Moose :: Role"에 대해 "너무 늦음"이 될 수는 없습니다. – Borodin
[weak_ref 옵션] (https://metacpan.org/pod/distribution/Moose/lib/Moose/Manual/Attributes.pod#Weak-references)을 사용할 수 있어야하지만 AKHolland와 Borodin에 동의합니다. 역할에 시간을 할애해야합니다. – interduo