В Perl довольно просто указывать обратный вызов или ссылку на код, если известен его пакет:
package Foo;
sub foo { print "in foo" }
# and then
package main;
sub baz {
my $code = shift;
$code->();
}
baz( \&Foo::foo );
А это печатает in foo
.
Допустим, у вас есть какой-то тривиальный объект, подобный этому:
package Foo;
sub new { bless {}, shift }
sub bar { print "in bar" }
sub baz { print "in baz" }
Вы можете найти метод, используя вышеуказанный способ (\ & Package: Method), и вызвать его как
package main;
my $foo = Foo->new();
my $ref = \&Foo::bar;
$foo->$ref();
Но иногда (хорошо, часто) вы не знаете явный тип. Допустим, есть Foo
, Bar
, Baz
, и все они имеют свой собственный метод blat
. Вы хотели бы получить ссылку на соответствующий метод, основываясь на объекте, а не на пакете. Как бы вы поступили об этом?