Une option est d'utiliser un sous-programme anonyme:
package Resources;
my $my_class = new MY_CLASS;
our $resource = { '/list' => sub { $my_class->list_files(@_); } };
...
package main;
# dereference the code ref
&{$Resources::resource->{'/list'}};
# or call it:
$Resources::resource->{'/list'}();
Si vous changez ce $my_class
références, seront également modifiés dans la fonction anonyme. Cela peut être ce que vous voulez; sinon, continuez à lire pour une fonction (bindMethod
) qui lie un objet et une méthode.
Si vous ne voulez pas la fonction anonyme apparaisse sur la pile:
our $resource = { '/list' => sub { unshift @_, $my_class;
goto &MyClass::list_files; } };
Notez que cette forme de goto
n'est pas l'habituel goto-déclaration, il est un tail call.
Vous pouvez définir une méthode d'assistance pour configurer la liaison, même si, honnêtement, cela ne vous rapportera pas grand-chose.
sub bindMethod {
my ($obj, $meth) = @_;
return sub { unshift @_, $obj; goto &{$meth}; }
}
my $my_class = new MyClass;
our $resource = { '/list' => bindMethod($my_class, \&MyClass::list_files) };
est ici une version de bindMethod
qui ne nécessite pas la classe à préciser le nom de la méthode.
sub bindMethod {
my ($obj, $meth) = @_;
if (! ref $meth) {
my $class = ref $obj;
$meth = \&{"${class}::$meth"};
}
return sub { unshift @_, $obj; goto &{$meth}; }
}
...
my $my_class = new MyClass;
our $resource = { '/list' => bindMethod($my_class, 'list_files') };
Quelle version de Perl? 5,8, 5,10, 6? – outis
5.8, nous n'utilisons plus 5.6 - heureusement! – John