[Moscow.pm] Moose | Mouse вопрос

Матюхин Вячеслав me на berekuk.ru
Сб Июл 14 04:13:06 PDT 2012


Наверное, самый простой способ — не нарушать стандартную конвенцию "new всегда возвращает объект", а сделать отдельный метод.

sub try_new {
    my $class = shift;
    return undef unless $condition;
    return $class->new(@_);
}

my $obj_or_undef = Foo->try_new(...);

14.07.2012, 14:24, "Ivan Petrov" <i.petro.77.00 на gmail.com>:
> есть нужда создать "мягкий" вариант конструктора, который будет
> возвращать 'undef' в случае неудачи.
>
> во всех хауту по Mouse/Moose пишут "не переопределяйте new"
>
> соответственно если пытаться сделать это в BUILDARGS
>
> sub BUILDARGS {
>     my $class = shift;
>
>     ..
>
>     return undef unless $condition;
>
>     return {
>             abc => 'cde',
>             cde => ...
>     }
> }
>
> то Mouse ругается что не хеш мы возвращаем
>
> c другой стороны определив new
>
> sub new {
>     my ($class, @args) = @_;
>     ...
>     return undef unless $condition;
>     return $self->SUPER::new({ abc => 'cde', cde => ... });
> }
>
> я добиваюсь чего хочу, но на такой пакет нелья поставить
> make_immutable поскольку мой new оно заменит своим
>
> выбрасывать исключение в BUILDARGS я не хочу, хочу вернуть undef.
>
> как правильно поступить?
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org


Подробная информация о списке рассылки Moscow-pm