package Test::MockFile::Plugins;

use strict;
use warnings;

our $VERSION = '0.031';

our @NAMESPACES = (q[Test::MockFile::Plugin]);

sub load_plugin {
    my ($name_or_array) = @_;

    my $list = ref $name_or_array ? $name_or_array : [$name_or_array];

    my @plugins;
    foreach my $name (@$list) {
        push @plugins, _load_plugin($name);
    }

    return @plugins;
}

sub _load_plugin {
    my ($name) = @_;

    my @candidates = map { "${_}::$name" } @NAMESPACES;

    foreach my $c (@candidates) {
        next unless _load($c);

        my $plugin = $c->new();
        return $plugin->register;
    }

    die qq[Cannot find a Test::MockFile plugin for $name];
}

sub _load {
    my ($pkg) = @_;

    return unless eval qq{ require $pkg; 1 };

    return $pkg->isa('Test::MockFile::Plugin');
}

1;

=encoding utf8

=head1 NAME

Test::MockFile::Plugins - Plugin loader

=head1 SYNOPSIS

  use Test::MockFile::Plugins;

  unshift @Test::MockFile::Plugins::NAMESPACES, q[Your::NameSpace];

  Test::MockFile::Plugins::load_plugins( 'YourPlugin' );

=head1 DESCRIPTION

L<Test::MockFile::Plugins> is responsible for loading plugins.

BETA WARNING: This is a preliminary plugins implementation. It might
change in the future.

=head1 METHODS

=head2 load_plugin( $plugin_name )

  Test::MockFile::Plugins::load_plugin( 'YourPlugin' );

=head1 SEE ALSO

L<Test::MockFile>, L<Test::MockFile::Plugin>

=cut