diff options
Diffstat (limited to 'lib/YAML/Any.pm')
-rw-r--r-- | lib/YAML/Any.pm | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/lib/YAML/Any.pm b/lib/YAML/Any.pm new file mode 100644 index 0000000..a85461f --- /dev/null +++ b/lib/YAML/Any.pm @@ -0,0 +1,122 @@ +use strict; use warnings; +package YAML::Any; +our $VERSION = '1.15'; + +use Exporter (); + +@YAML::Any::ISA = 'Exporter'; +@YAML::Any::EXPORT = qw(Dump Load); +@YAML::Any::EXPORT_OK = qw(DumpFile LoadFile); + +my @dump_options = qw( + UseCode + DumpCode + SpecVersion + Indent + UseHeader + UseVersion + SortKeys + AnchorPrefix + UseBlock + UseFold + CompressSeries + InlineSeries + UseAliases + Purity + Stringify +); + +my @load_options = qw( + UseCode + LoadCode +); + +my @implementations = qw( + YAML::XS + YAML::Syck + YAML::Old + YAML + YAML::Tiny +); + +sub import { + __PACKAGE__->implementation; + goto &Exporter::import; +} + +sub Dump { + no strict 'refs'; + no warnings 'once'; + my $implementation = __PACKAGE__->implementation; + for my $option (@dump_options) { + my $var = "$implementation\::$option"; + my $value = $$var; + local $$var; + $$var = defined $value ? $value : ${"YAML::$option"}; + } + return &{"$implementation\::Dump"}(@_); +} + +sub DumpFile { + no strict 'refs'; + no warnings 'once'; + my $implementation = __PACKAGE__->implementation; + for my $option (@dump_options) { + my $var = "$implementation\::$option"; + my $value = $$var; + local $$var; + $$var = defined $value ? $value : ${"YAML::$option"}; + } + return &{"$implementation\::DumpFile"}(@_); +} + +sub Load { + no strict 'refs'; + no warnings 'once'; + my $implementation = __PACKAGE__->implementation; + for my $option (@load_options) { + my $var = "$implementation\::$option"; + my $value = $$var; + local $$var; + $$var = defined $value ? $value : ${"YAML::$option"}; + } + return &{"$implementation\::Load"}(@_); +} + +sub LoadFile { + no strict 'refs'; + no warnings 'once'; + my $implementation = __PACKAGE__->implementation; + for my $option (@load_options) { + my $var = "$implementation\::$option"; + my $value = $$var; + local $$var; + $$var = defined $value ? $value : ${"YAML::$option"}; + } + return &{"$implementation\::LoadFile"}(@_); +} + +sub order { + return @YAML::Any::_TEST_ORDER + if @YAML::Any::_TEST_ORDER; + return @implementations; +} + +sub implementation { + my @order = __PACKAGE__->order; + for my $module (@order) { + my $path = $module; + $path =~ s/::/\//g; + $path .= '.pm'; + return $module if exists $INC{$path}; + eval "require $module; 1" and return $module; + } + croak("YAML::Any couldn't find any of these YAML implementations: @order"); +} + +sub croak { + require Carp; + Carp::croak(@_); +} + +1; |