The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Album::Role::Storage; {

    use Moose::Role;
    use Perl6::Junction qw(any);

    requires 'asset_info_from_path', 'items_in_source';

    has source => (
        is => 'ro',
        required => 1,
    );

    has allowed_types => (
        is => 'ro',
        isa => 'ArrayRef[Str]',
        required => 1,
        auto_deref => 1,
    );

    sub available_assets {
        my ($self) = @_;
        my @assets;
        foreach my $path ($self->items_in_source) {
            if(my $info = $self->asset_info_from_path($path)) {
                if($self->is_type_allowed($info->{mime_type})) {
                    push @assets, $info;
                }
            }
        }
        return @assets;
    }

    sub  is_type_allowed {
        my ($self, $type) = @_;
        return any($self->allowed_types) eq $type ? 1:0;
    }
}

1;