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 ];
        },
    )
};
Другие вопросы по тегам