package Pugs::Utils::Dump;
use strict;
use warnings;
require Exporter;
our @ISA=qw(Exporter);
our @EXPORT=qw(dump_tree);
use Pugs::Utils::Interface;
my $dumper;
# which modules do diffrent formats use
my %format = (
yaml => ['YAML' => \&yaml],
p5 => ['Data::Dumper' => \&p5 ],
xml => ['XML::Generator' => \&xml ],
);
# dump data as yaml
sub yaml {
YAML::Dump($_[0]);
}
# dump data as xml
sub xml {
my $x = new XML::Generator(":pretty");
return $x->ast(xmlify($x,$_[0]));
}
# xml helper routine
sub xmlify {
my $x = shift;
my $val = shift;
if (ref $val eq 'HASH') {
return map {
$x->$_(xmlify($x,$val->{$_}) )
} keys %{$val};
} elsif (ref $val eq 'ARRAY') {
return map {xmlify($x,$_) } @{$val};
} else {
return $val;
}
}
# dump data as p5
sub p5 {
local $Data::Dumper::Varname = $_[1];
$Data::Dumper::Indent = 1;
Data::Dumper::Dumper($_[0]);
}
sub import {
# get the format specified on the command line
$dumper = $format{$Pugs::Utils::Interface::format};
# load the required module
eval "require $dumper->[0]";
die "install $dumper->[0] to enable $interface::format" if $@;
#export the funtions
Pugs::Utils::Dump->export_to_level(1,@_);
}
sub dump_tree {
my ($tree,$name) = @_;
return $dumper->[1]($tree,$name);
}
1;