В прошлом у меня было такое точное требование несколько раз, и сегодня я фактически должен был выполнить его из метакласса, что означало, что настройка BUILD не допускается. Во всяком случае, я чувствовал, что было бы хорошо поделиться, поскольку он в основном делает именно то, что упоминал эфир:
«Это позволило бы помечать атрибуты», это лениво, потому что это зависит
на других значениях атрибута, которые будут построены, но я хочу, чтобы он ткнул
до завершения строительства. "'
Однако, сумасшедший сумасшедший, я понятия не имею, как сделать модуль CPAN, поэтому вот несколько кодов:
https://gist.github.com/TiMBuS/5787018
Поместите вышеупомянутое в Late.pm, и затем вы можете использовать его так:
package Thing;
use Moose;
use Late;
has 'foo' => (
is => 'ro',
default => sub {print "setting foo to 10\n"; 10},
);
has 'bar' => (
is => 'ro',
default => sub {print 'late bar being set to ', $_[0]->foo*2, "\n"; $_[0]->foo*2},
late => 1,
);
#If you want..
__PACKAGE__->meta->make_immutable;
1;
package main;
Thing->new();
#`bar` will be initialized to 20 right now, and always after `foo`.
#You can even set `foo` to 'lazy' or 'late' and it will still work.