The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package IM::Engine::RequiresPlugins;
use MooseX::Role::Parameterized;

parameter plugins => (
    is       => 'ro',
    isa      => 'ArrayRef|Str',
    required => 1,
);

role {
    my $p = shift;
    my $plugins = $p->plugins;
    my @plugins = ref($plugins) ? @$plugins : $plugins;

    requires 'post_initialization', 'engine';

    after post_initialization => sub {
        my $self = shift;
        my %has_plugin = map { blessed($_) => 1 } $self->engine->plugins;

        for (@plugins) {
            $has_plugin{$_} or die blessed($self) . " requires the $_ plugin.";
        }
    };
};

no MooseX::Role::Parameterized;

1;