私はという基本クラスを持っていますA
:
package A;
use strict;
use warnings;
use v5.12;
sub import {
my $caller = caller;
say 'import called from ' . $caller;
if (not $caller->can('has')) {
no strict 'refs';
say "--> import has to $caller";
*{"${caller}::has"} = sub { _attr($caller, @_) };
}
}
sub _attr {
my ($class, $name, $default) = @_;
no strict 'refs';
*{"${class}::$name"} = sub {
my ($self, $value) = @_;
$self->{$name} = $value if $value;
return $self->{$name} // $default;
};
}
1;
そして、子クラスがありB
ます:
package B;
use strict;
use warnings;
use lib './';
use base 'A';
use v5.12;
#use C;
A->import();
has 'ans' => 42;
say ans();
1;
このコードを実行しようとすると、構文エラーが発生しますが、これらの変更has 'ans' => 42'
を加えるとhas('ans' => 42);
、すべて正常に機能します。
または、クラスを作成した場合C
:
package C;
use strict;
use warnings;
use lib '.';
use base 'A';
1;
その後、すべてが機能するため、has 'ans'...
このコードを変更する必要はありません。has(...
だから、なぜこれが起こるのか理解できません。has
子モジュールにサブルーチンをインポートするにはどうすればよいですか?