Bread::Board - вставка параметров с ограничениями типа ArrayRef?
С помощью Moose
а также Bread::Board
Можно ли создать объект с атрибутом, который имеет ArrayRef[SomeObject]
введите ограничение и введите этот параметр таким образом, чтобы:
-
ArrayRef
ограничение сохраняется, - Каждый объект, который является членом этого ArrayRef, имеет все свои зависимости, встречаемые
Bread::Board
, а также - Каждый объект, который является членом этого ArrayRef, является объектом, который был создан
Bread::Board
?
Чтобы убедиться, что я объясняю себя ясно, давайте рассмотрим невероятно наивный пример. Допустим, у нас есть Wheel
учебный класс:
package Wheel;
use Moose;
has ['size', 'maker'] => (isa => 'Str', is => 'rw', required => 1);
И давайте создадим Vehicle
класс, где каждый экземпляр содержит группу колес:
package Vehicle;
use Moose;
has 'wheels' => (
is => 'rw',
isa => 'ArrayRef[Wheel]',
required => 1,
);
Можно ли создать один или несколько экземпляров Wheel
а затем вставить ссылку на массив, содержащий эти экземпляры, в наш новый Vehicle
пример? Это явно не сработает:
my $c = container 'app' => as {
container 'wheels' => as {
service 'maker' => "Bob's Tires";
service 'size' => "195R65/15";
service 'carTires' => (
class => 'Wheel',
dependencies => [ depends_on('maker'), depends_on('size') ],
)
};
container 'vehicles' => as {
service 'sedan' => (
class => 'Vehicle',
dependencies => {
# WON'T WORK
wheels => depends_on('/wheels/carTires'),
}
)
};
};
my $v = $c->resolve(service => 'vehicles/sedan');
Есть идеи? Да, я знаю, что это мое Vehicle
У него, возможно, нет колес, и я пытаюсь создать одноколесный седан, но я думаю, вы поняли мою точку зрения.:-) Это только невероятно тривиальный пример.
1 ответ
Вы можете получить сервис carTires для возврата ArrayRef of Wheels:
container 'wheels' => as {
service 'carTires' => (
block => sub {
return [ map {Wheel->new} 1..4 ];
},
)
};
Конструктор Vehicle позаботится об остальном с точки зрения ограничения типа, поскольку вы уже определили его как ArrayRef[Wheel].
Так что он умрет, если вы сделаете это вместо этого:
container 'wheels' => as {
service 'carTires' => (
block => sub {
return [ map {Window->new} 1..4 ];
},
)
};