Как я могу настроить рендеринг объектов в longmess?

Мы'Мы медленно реорганизуем наше большое приложение Perl в сторону объектно-ориентированных интерфейсов, особенно для моделей данных. Раздражает то, что трассировка стека становится менее полезной. Чтобы дать сфабрикованный пример: до.

sub send_message {
    my ($user_id, $message) = @_;
    ...
    Carp::confess('test');
}

# output:
test at example.pm line 23
    foo('42', 'Hello World') called at example.pl line 5

После.

sub send_message {
    my ($user, $message) = @_;
    ...
    Carp::confess('test');
}

# output:
test at example.pm line 23
    foo('MyApp::Model::User=HASH(0x2c94f68)', 'Hello World') called at example.pl line 5

Так что теперь я не могу видеть, какой пользователь был переданfoo()Я вижу только имя класса (которое уже задокументировано) и некоторый адрес памяти объекта.

Я попытался установить оператор строкового преобразования в классе модели, используя overload.pm:

use overload ( '""' => \&stringify );

sub stringify {
    my ($self) = @_;
    return sprintf '%s[id=%d]', ref($self), $self->id;
}

Но это не влияет на долгожителей. Я хотел бы что-то вроде этого:

test at example.pm line 23
    foo('MyApp::Model::User[id=42]', 'Hello World') called at example.pl line 5

То есть первый параметрfoo() должен отображаться с использованием объектаstringify() метод. Как я могу этого достичь?

Ответы на вопрос(1)

Ваш ответ на вопрос