Как я могу настроить рендеринг объектов в 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()
метод. Как я могу этого достичь?