package Foo;
our %callbacks = (
pig => sub { ... },
cat => sub { ... },
dog => sub { ... }
);
while (...) {
# do stuff
$choice = ...;
$callbacks{$choice}->(@args);
}
####
package main;
use Foo;
$Foo::callbacks{iguana} = sub { ... };
####
%Time ExclSec CumulS #Calls sec/call Csec/c Name
90.73 0.770 0.648 60783 0.0000 0.0000 Foo::__ANON__
####
package Foo;
sub Foo::callbacks::pig { ... } # no more hash!
sub Foo::callbacks::cat { ... }
sub Foo::callbacks::dog { ... }
while (...) {
# do stuff
$choice = ...; # of course, we also validate $choice
no strict 'refs';
&{"Foo::callbacks::$choice"}(@args); # I feel so dirty!
}
package main;
## now extend Foo by doing this:
use Foo;
sub Foo::callbacks::iguana { ... }