You shouldn't have the %animal_sounds as a global variable in the main namespace (main:: or ::), but maybe have it as a global variable in the Animal:: namespace. You don't need the BEGIN blocks around your animal registration section, and you also don't break stricture.
Personally, I would use any of the Pluggable modules, like Module::Pluggable, especially when you want new plugins to become automatically discovered when they are available:
package Animal; use Carp qw(croak); use Module::Pluggable require => 1, search_path => 'Animal', sub_name => known_animals; # use Memoize; # memoize('known_animals'); my @known_animals = __PACKAGE__->known_animals; my %animal_sounds; for my $animal (@known_animals) { for my $sound ($animal->sounds) { croak "Ambigous sound '$sound' ($animal / $animal_sounds{$soun +d})" if exists $animal_sounds{$sound}; $animal_sounds{$sound} = $animal; }; }; # and in a separate file Animal/Dog.pm: package Animal::Dog; sub sounds { 'woof' };
In reply to Re: Factory Pattern
by Corion
in thread Factory Pattern
by tomazos
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |