Как лучше переопределить / обернуть основные функции, такие как sysread, когда они вызываются в другом пакете
Я работаю над довольно сложным приложением, написанным на Perl. Я довольно опытный с языком, но я просто озадачен этим.
Я использую модуль Foo, который использует sysread и syswrite для различных операций над дескриптором файла (в данном случае это двунаправленный сокет), который я передаю его конструктору.
Я хочу сделать следующее: из другого модуля, который я пишу (давайте назовем его Bar), я хочу изменить способ поведения sysread/write только при вызове изнутри методов, принадлежащих Foo
Sysread и др. Должны работать как обычно везде. Можно смело предположить, что использование sysread не изменится в Foo.
Причина, по которой я хочу это сделать, заключается в том, что мне нужно отслеживать количество байтов, считываемых / записываемых в вышеупомянутый дескриптор файла. На данный момент кажется, что это единственный способ получить эту информацию - в основном сохранение возвращаемого значения из sysread/write.
У меня нет проблем с использованием чего-либо из CPAN, если оно хорошего качества.
Обновление: я нашел лучшее решение для моей конкретной проблемы и разместил код здесь:
https://github.com/Hercynium/Tie-Handle-CountChars
Похоже, что он очень хорошо работает в моем приложении, но я не буду публиковать его в CPAN, пока не провожу более тщательное тестирование, плюс не написал несколько реальных модульных тестов:)
1 ответ
Вы можете сделать это, создав собственную функцию Foo:: sysread, которая оборачивает основную функцию, регистрируя возвращаемое значение. Обтекание может быть выполнено автоматически (что избавляет вас от необходимости возиться с таблицей символов самостоятельно) с помощью Class:: Method:: Modifiers:
package Foo;
use strict;
use warnings;
# ... other code...
use Class::Method::Modifiers;
around sysread => sub {
my $orig = shift;
my $return = CORE::sysread(@_);
# do something with $return
return $return;
};