burguillos.info/lib/BurguillosInfo/Species.pm

59 lines
1.3 KiB
Perl

package BurguillosInfo::Species;
use v5.36.0;
use strict;
use warnings;
use Moo;
use Module::Pluggable
search_path => ['BurguillosInfo::Species'],
instantiate => 'new',
on_require_error => sub ( $plugin, $error ) {
die $error;
};
{
my %hash_species;
sub _hash ($self) {
if ( !scalar keys %hash_species ) {
$self->_populate_hash;
}
return {%hash_species};
}
sub _populate_hash ($self) {
my @species = $self->plugins();
print Data::Dumper::Dumper \@species;
for my $specie (@species) {
$self->_check_specie_valid($specie);
if (exists $hash_species{$specie->id}) {
die "Duplicated species id @{[$specie->id]}.";
}
$hash_species{$specie->id} = $specie;
}
}
}
sub _check_specie_valid ( $self, $specie ) {
if ( !$specie->does('BurguillosInfo::Specie') ) {
die "$specie does not implement BurguillosInfo::Specie.";
}
}
sub get($self, $id) {
return $self->_hash->{$id};
}
sub list($self) {
my @species_keys = keys %{$self->_hash};
my $species = [ sort { $a->id cmp $b->id } map { $self->_hash->{$_} } @species_keys ];
return $species;
}
sub list_can_be_global($self) {
return [ grep { $_->can_be_global } $self->list->@* ];
}
1;