The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package File::Assets::Bucket;

use warnings;
use strict;

use Object::Tiny qw/kind assets/;

sub new {
    my $self = bless {}, shift;
    $self->{kind} = my $kind = shift;
    $self->{assets} = my $assets = shift;
    $self->{slice} = [];
    $self->{filters} = [];
    return $self;
}

sub add_asset {
    my $self = shift;
    my $asset = shift;
    push @{ $self->{slice} }, $asset;
}

sub add_filter {
    my $self = shift;
    my $filter = shift;

    my $signature = $filter->signature;
    my $filters = $self->{filters};

    if (defined $signature) {
        for my $entry (@$filters) {
            if (defined $entry->[0] && $entry->[0] eq $signature) {
                $entry->[1] = $filter;
                return;
            }
        }
    }

    push @$filters, [ $signature, $filter ];
}

sub exports {
    my $self = shift;
    my @assets = $self->all;
    my $filters = $self->{filters};
    for my $entry (@$filters) {
        $entry->[1]->filter(\@assets, $self, $self->assets);
    }
    return @assets;
}

sub clear {
    my $self = shift;
    $self->{slice} = [];
    $self->{filters} = {};
}

sub all {
    my $self = shift;
    return @{ $self->{slice} };
}

1;