Set :: Object с проверкой ограничения типа - PullRequest
2 голосов
/ 22 февраля 2011

Я пытаюсь расширить Set :: Object, чтобы разрешить проверку ограничения типа при вставке объектов. Мой класс до сих пор выглядит так:

package My::Set::Object;

use strict;
use warnings;

use Moose;
use MooseX::NonMoose;
extends 'Set::Object';

has type => (is => 'ro', isa => 'Str', required => 1);

before [ qw(insert invert intersection union) ] => sub {
my ($self,$list) = @_;

for (@$list) {
    confess "Only ",$self->type," objects are allowed " unless $_->does($self->type);
}
};

no Moose;
__PACKAGE__->meta->make_immutable;

К сожалению, похоже, что аргументы конструкции передаются и в Set :: Object, когда я делаю следующее примерное построение объекта

my $set = My::Set::Object->new(type => 'Foo::Bar');

После распечатывания содержимого набора я обнаружил, что "type" и "Foo :: Bar" являются членами набора.

Как я могу это исправить? Или, может быть, есть более простой способ сделать это?

1 Ответ

6 голосов
/ 22 февраля 2011

Здесь как фактический ответ.Я обычно пишу эти строки и должен делать то, что вам нужно.Предупреждение: я не тестировал этот код, он может даже не компилироваться, но он должен помочь вам в правильном направлении.Единственное реальное отличие от этого подкласса -> ISA в ваших объектах My :: Set :: Object не будет истинным при проверке Set :: Object.

package My::Set::Object;

use strict;
use warnings;

use Moose;
use Set::Object;

my @methods = qw/insert includes has contains invert intersection union/; # etc etc.

has type => (is => 'ro', isa => 'Str', required => 1);
has _so => (is => 'ro', isa => 'Set::Object', handles => \@methods, lazy_build => 1);

before [ qw(insert invert intersection union) ] => sub {
  my ($self,$list) = @_;

  for (@$list) {
    confess "Only ",$self->type," objects are allowed " unless $_->does($self->type);
  }
};

sub _build__so {
  return Set::Object->new()
}
no Moose;
__PACKAGE__->meta->make_immutable;
...