Я пытаюсь наследовать и расширять базовый класс более конкретным дочерним классом, который удаляет обязательный атрибут из средства доступа и указывает лениво построенный по умолчанию. Однако при этом производный класс больше не оборачивает подпрограмму вокруг вызовов вокруг метода доступа.
Что я делаю не так в своем определении?
Edit: я должен заявить, что я могу просто наследовать метод доступа без его изменения, и модификаторround все еще работает, и я знаю, что могу сделать что-то вроде установки метода доступа для получения, затем определить метод получения с помощью метода имя средства доступа (то есть sub attr { my $self = shift; my $value = $self->_get_attr; return "The value of attr is '$value'"; }
). Я просто удивлен, что модификатор вокруг так легко сбрасывается.
use strict;
use warnings;
use 5.010;
package My::Base;
use Moose;
has 'attr' => (is => 'ro', isa => 'Str', required => 1);
around 'attr' => sub {
my $orig = shift;
my $self = shift;
my $response = $self->$orig(@_);
return "The value of attr is '$response'"
};
package My::Derived;
use Moose;
extends 'My::Base';
has '+attr' => (required => 0, lazy_build => 1);
sub _build_attr {
return "default value";
}
package main;
my $base = My::Base->new(attr => 'constructor value');
say $base->attr; # "The value of attr is 'constructor value'"
my $derived = My::Derived->new();
say $derived->attr; # "default value"