Насколько я помню, всякий раз, когда я использую модуль, в начале моего кода я добавляю строку use
.
Недавно я писал два объектных модуля Moose, которые используют друг друга. Посмотрите на этот упрощенный пример:
Один модуль:
package M1 0.001;
use Moose;
use 5.010;
use namespace::autoclean;
# use M2; ### SEE QUESTION BELOW
has 'name' => (
is => 'ro',
isa => 'Str',
required => 1,
);
has 'very_cool_name' => (
is => 'ro',
lazy => 1,
builder => '_build_very_cool_name',
);
sub _build_very_cool_name {
my ($self) = @_;
my $m2 = M2->new( m1 => $self );
return 'very ' . $m2->cool_name();
}
__PACKAGE__->meta->make_immutable;
1;
Другой модуль:
пакет М2 0,001;
use Moose;
use 5.010;
use Data::Dumper; # TODO DEBUG REMOVE
use namespace::autoclean;
use M1;
has 'm1' => (
is => 'ro',
isa => 'M1',
required => 1,
);
sub cool_name {
my ($self) = @_;
return 'cool ' . $self->m1->name();
}
__PACKAGE__->meta->make_immutable;
1;
И короткий пример, который их использует:
use strict;
use warnings;
use 5.010;
use M1;
use M2;
my $m1 = M1->new(name => 'dave');
say $m1->very_cool_name();
Теперь обратите внимание, что два модуля используют друг друга. M1
создает экземпляр M2
и использует его для генерации very_cool_name
, тогда как M2
имеет экземпляр M1
в качестве атрибута.
Теперь, если я раскомментирую use M2;
в M1
, мое затмение сходит с ума. Я думаю, это потому, что это цикл, созданный этим «круговым использованием».
Я прокомментировал это use
, и все, кажется, работает нормально (я думаю ...), но меня очень беспокоит (я использую объект без use
- своего класса! Это «законно»? ..). Это также заставило меня задуматься:
Когда мне действительно нужно использовать use
? Я думаю, что меня учили всегда использовать его, и, конечно, когда я использую объект.
Есть ли что-то принципиально неправильное, когда два модуля используют друг друга (в том смысле, что каждый использует объект другого модуля; я знаю, что в некоторых случаях это логически невозможно, но иногда - как в этом случае) Я думаю, что это имеет смысл).