use strict; use warnings; use Class::MOP; # Callback functions --------------------------------------- sub first_callback { my $z = $_[1]; print "in first_callback, z=$z\n"; return 1; } sub last_callback { my $z = $_[1]; print "in last_callback, z=$z\n"; return 2; } # Implementation of dispatch table ------------------------- my $invoker_pkg = Class::MOP::Package->create('Invoker'); $invoker_pkg->add_package_symbol('&first', \&first_callback); $invoker_pkg->add_package_symbol('&last', \&last_callback); # use Data::Dumper; # my $r = $invoker_pkg->namespace(); warn Dumper($r); sub invoker { my $name = shift; $invoker_pkg->has_package_symbol('&' . $name) or return -1; Invoker->$name(@_); } # Main program for testing --------------------------------- for my $name ( "first", "last", "fred" ) { my $rc = invoker( $name, $name . '-arg' ); print "$name: rc=$rc\n"; }