Bread :: Board - вставка параметров с ограничениями типа ArrayRef? - PullRequest
3 голосов
/ 14 июня 2011

Используя 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 Ответ

4 голосов
/ 14 июня 2011

Вы можете получить сервис 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 ];
        },
    )
};
...