Полезные ошибки для Moose и MooseX :: Declare - PullRequest
8 голосов
/ 30 мая 2011

Moose очень хорош, но иногда простые опечатки могут вызывать невероятно захватывающие длинные стековые трассы с, с моей точки зрения, нулевым полезным контентом.

Итак, есть ли какие-то инструменты, чтобы интерпретировать это как нечто взрывное?полезно?

В частности, для классов, использующих обычный Moose, Moose + MooseX :: Method :: Signatures и MooseX :: Declare.

Инструменты должны быть полезны только при разработке, чтобы поймать ихопечатки или проблемы с мышлением, из-за которых вещи просто не работают.

=========================

Следующее предложениениже, я использую этот не совсем модуль, который немного уменьшает мои головные боли, хотя приветствуются новые идеи:

package MooseX::QuietCarping;
# Not actually a Moose thing, but helpful for Moose.
# calm Moose-internal stacktraces down a little
use Carp;

my %retain = ();
sub import {
    my $class = shift;
    $retain{$_}++ for @_;
}

CHECK {
    for (sort keys %INC) {
    s{\.pm$}{};
    s{[/\\]}{::}g; # CROSS PLATFORM MY ARSE
    next if $retain{$_};
    $Carp::Internal{$_}++ if /^(?:Class::MOP|Moose|MooseX)\b/
    }
    %retain = (); # don't need this no more
}

1;

Ответы [ 3 ]

4 голосов
/ 30 мая 2011

Один из способов, с которым я экспериментировал некоторое время назад, это помещать связанные с Moose классы в %Carp::Internal хеш, что-то вроде этого:

$Carp::Internal{$_}++ for qw{
    Class::MOP
    Class::MOP::Attribute
    Class::MOP::Class
    ...
};

Такие классы будут пропущены в трассировке стека, что сделает его более компактным и выделяющимваш собственный код

Найти их можно, пройдя переменную %INC:

package Dummy;
use Moose;
use MooseX::Declare;
# use ....;

for (sort keys %INC) {
    s{\.pm$}{};
    s{/}{::}g;
    print "$_\n" if /^(Class::MOP|Moose|MooseX)\b/;
}
2 голосов
/ 31 декабря 2011

Method::Signatures::Modifiers - это пакет, который надеется решить некоторые из проблем MooseX::Method::Signatures.Просто use это перегрузить.

use MooseX::Declare;
use Method::Signatures::Modifiers;

class Foo
{
    method bar (Int $thing) {
        # this method is declared with Method::Signatures instead of MooseX::Method::Signatures
    }
}
2 голосов
/ 30 мая 2011

Мне кажется, я вспоминал, как видел сообщение PerlMonks от stvn неделю или две назад, в котором говорилось, что они работают над улучшением сообщений об ошибках Moose. Я не думаю, что в настоящее время есть что-то для очистки.

...