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

    use Moose;

    with 'MooseX::Role::BuildInstanceOf' => {
        target => '~Storage',
    };

    with 'MooseX::Role::BuildInstanceOf' => {
        target => '::Set',
        type => 'factory',
    };

    with 'MooseX::Role::BuildInstanceOf' => {
        target => 'Album::ResourceTypes',
        fixed_args => [
            resources=>[qw/Album::Image Album::Text/],
        ],
    };

    has title => (
        is => 'ro',
        isa => 'Str',
        required => 1,
        default => 'My Album',
    );

    around 'merge_storage_args' => sub {
        my ($orig, $self) = @_;
        return (
            allowed_types => [$self->resource_types->allowed_types],
            $self->$orig,
        );
    };

    around 'merge_set_args' => sub {
        my ($orig, $self) = @_;
        return (
            resource_types => $self->resource_types,
            collection => [$self->storage->available_assets],
            $self->$orig,
        );
    };
}

1;