The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Class::Component::Component::AutoloadPlugin;
use strict;
use warnings;

sub autoload_plugins {
    my($class, @plugins) = @_;

    for my $plugin (@plugins) {
        my $name = ref $plugin ? $plugin->{module} : $plugin;
        unless (_is_loaded($class, $name)) {
            $class->load_plugins($plugin);
        }
    }
}

sub _is_loaded {
    my ($c, $stuff) = @_;

    my $base = ref $c || $c;

    for my $plugin (@{ $c->class_component_plugins }) {
        my $module = ref $plugin;
        my $pkg = $stuff;
        unless (($pkg = $stuff) =~ s/^\+//) {
            $module =~ s/^$base\::Plugin\:://;
        }
        return 1 if $pkg eq $module;
    }

    return;
}

1;