Я только недавно начал на Moose и его отличной OO-среде не только для использования, но и для изучения новых OO-концепций. Одна из вещей, которую я хотел сделать, - создавать отчеты об ошибках с точки зрения вызывающей стороны во время создания объекта. Я видел, что у Moose есть модуль Moose :: Error :: Croak, который говорит Moose переопределить отчеты об ошибках по умолчанию при вызове croak. Я использовал это, но это не помогло
Код Moose - Foo.pm
package Foo;
use metaclass (
metaclass => 'Moose::Meta::Class',
error_class => 'Moose::Error::Croak',
);
use Moose;
has 'attr1' => (
is => 'rw',
isa => 'Str',
required => '1',
);
no Moose;
1;
код Moose - fooser.pl
#!/usr/bin/perl
use strict;
use warnings;
use Foo;
my $foobj = Foo->new();
Это не с ошибкой:
Атрибут (attr1) необходим в строке /usr/local/lib/perl/5.8.8/Class/MOP/Class.pm 364
, что меньше, чем фактическая трассировка стека, если Moose :: Error :: Croak не используется. Но это не сообщает об этом с точки зрения абонента. Если бы это был код Perl 5 OO и у меня был Foo.pm как:
package Foo;
use strict;
use warnings;
use Carp;
sub new {
my ($class, %args) = @_;
my $self = {};
if (! exists $args{'attr1'}) {
croak "ERR: did not provide attr1";
}
$self->{'attr1'} = $args{attr1};
bless $self, $class;
return $self;
}
1;
И если fooser.pl был запущен, я получил бы ошибку:
"ОШИБКА: не предоставил attr1 в строке 6 fooser.pl"
, что с точки зрения вызывающего абонента, поскольку оно указывает на строку №. 6 из файла fooser.pl, а не строки MOP.pm. 364.
Как я могу сделать это в Музе? Или я что-то здесь неправильно понимаю?