The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package YAML::Foo::Loader;
use YAML::Perl::Loader -base;
package YAML::Bar::Loader;
use YAML::Perl::Loader -base;
package YAML::Foo::Dumper;
use YAML::Perl::Dumper -base;
package YAML::Bar::Dumper;
use YAML::Perl::Dumper -base;
package YAML::Foo::Resolver;
use YAML::Perl::Resolver -base;
package YAML::Bar::Resolver;
use YAML::Perl::Resolver -base;

package main;
use t::TestYAMLPerl tests => 21;

use YAML::Perl;

my $class = 'YAML::Perl';

for my $type (qw(Loader Dumper Resolver)) {
    pass "$type tests ---------------------------------------------------------";

    my $method = lc($type);
    my $class_method = lc($type) . '_class';
    no strict 'refs';

    my $object_class = $class->$class_method;
    is $object_class, "$class\::$type",
        "Call to $class->$class_method method works";

    is ref($class->$method), "$class\::$type",
        "Call to $class->$method produces a $type object";

    is ref($class->new->$method), "$class\::$type",
        "Call to $class->new->$method produces a $type object";

    is ref($class->new->$class_method("YAML::Foo::$type")->$method), "YAML::Foo::$type",
        "Call to $class->new->$class_method(\"YAML::Foo::$type\")->$method produces a YAML::Foo::$type object";

    ${"YAML::${type}Class"} = "YAML::Foo::$type";
    is ref($class->$method), "YAML::Foo::$type",
        "$class->$method respects \$YAML::${type}Class";

    ${"YAML::Perl::${type}Class"} = "YAML::Bar::$type";
    is ref($class->$method), "YAML::Bar::$type",
        "$class->$method respects \$YAML::Perl::${type}Class";
}