BEGIN { my @yaml_classes = qw{YAML::XS YAML::Syck YAML::Tiny YAML}; first { eval "use $_; 1" } @yaml_classes or die "Unable to load any of these YAML classes: @yaml_classes"; } #### Unable to load any of these YAML classes: YAML::XS YAML::Syck YAML::Tiny YAML at ... BEGIN failed--compilation aborted at ... #### my $yaml_class; BEGIN { my @yaml_classes = qw{YAML::XS YAML::Syck YAML::Tiny YAML}; $yaml_class = first { eval "use $_; 1" } @yaml_classes or die "Unable to load any of these YAML classes: @yaml_classes"; } print $yaml_class; #### BEGIN { # YAML classes to attempt to load (in order of preference) my @yaml_classes = qw{YAML::XS YAML::Syck YAML::Tiny YAML}; # Expecting to import these functons from whatever YAML class is loaded my @yaml_imports = qw{Dump Load}; my $yaml_class = first { eval "use $_ (\@yaml_imports); 1" } @yaml_classes or die "Unable to load any of these YAML classes: @yaml_classes", " (using import list: @yaml_imports)"; } #### BEGIN { my @yaml_classes = qw{YAML::XS YAML::Syck YAML::Tiny YAML}; my $yaml_class = first { eval "use $_; 1" } @yaml_classes or die "Unable to load any of these YAML classes: @yaml_classes"; # Only expecting whatever YAML class is loaded to export these functions my @yaml_funcs = qw{Dump Load}; no strict 'refs'; my %yaml_exports = map { $_ => 1 } @{$yaml_class . "::EXPORT"}; $yaml_exports{$_} or die "$yaml_class doesn't export '$_'" for @yaml_funcs; }