YAML-PP
view release on metacpan or search on metacpan
lib/YAML/PP/Dumper.pm view on Meta::CPAN
if (keys %args) {
die "Unexpected arguments: " . join ', ', sort keys %args;
}
my $self = bless {
representer => YAML::PP::Representer->new(
schema => $schema,
preserve => $preserve,
),
version_directive => $version_directive,
emitter => $emitter,
seen => {},
anchors => {},
anchor_num => 0,
header => $header,
footer => $footer,
}, $class;
return $self;
}
sub clone {
my ($self) = @_;
my $clone = {
representer => $self->representer->clone,
emitter => $self->emitter->clone,
version_directive => $self->version_directive,
seen => {},
anchors => {},
anchor_num => 0,
header => $self->header,
footer => $self->footer,
};
return bless $clone, ref $self;
}
sub init {
my ($self) = @_;
$self->{seen} = {};
$self->{anchors} = {};
$self->{anchor_num} = 0;
}
sub emitter { return $_[0]->{emitter} }
sub representer { return $_[0]->{representer} }
sub set_representer { $_[0]->{representer} = $_[1] }
sub header { return $_[0]->{header} }
sub footer { return $_[0]->{footer} }
sub version_directive { return $_[0]->{version_directive} }
sub dump {
my ($self, @docs) = @_;
$self->emitter->init;
$self->emitter->stream_start_event({});
for my $i (0 .. $#docs) {
my $header_implicit = ($i == 0 and not $self->header);
my %args = (
implicit => $header_implicit,
);
if ($self->version_directive) {
my ($major, $minor) = split m/\./, $self->representer->schema->yaml_version;
$args{version_directive} = { major => $major, minor => $minor };
}
$self->emitter->document_start_event( \%args );
$self->init;
$self->_check_references($docs[ $i ]);
$self->_dump_node($docs[ $i ]);
my $footer_implicit = (not $self->footer);
$self->emitter->document_end_event({ implicit => $footer_implicit });
}
$self->emitter->stream_end_event({});
my $output = $self->emitter->writer->output;
$self->emitter->finish;
return $output;
}
sub _dump_node {
my ($self, $value) = @_;
my $node = {
value => $value,
};
if (ref $value) {
my $seen = $self->{seen};
my $refaddr = refaddr $value;
if ($seen->{ $refaddr } and $seen->{ $refaddr } > 1) {
my $anchor = $self->{anchors}->{ $refaddr };
unless (defined $anchor) {
if ($self->representer->preserve_alias) {
if (ref $node->{value} eq 'YAML::PP::Preserve::Scalar') {
if (defined $node->{value}->alias) {
$node->{anchor} = $node->{value}->alias;
$self->{anchors}->{ $refaddr } = $node->{value}->alias;
}
}
elsif (reftype $node->{value} eq 'HASH') {
if (my $tied = tied %{ $node->{value} } ) {
if (defined $tied->{alias}) {
$node->{anchor} = $tied->{alias};
$self->{anchors}->{ $refaddr } = $node->{anchor};
}
}
}
elsif (reftype $node->{value} eq 'ARRAY') {
if (my $tied = tied @{ $node->{value} } ) {
if (defined $tied->{alias}) {
$node->{anchor} = $tied->{alias};
$self->{anchors}->{ $refaddr } = $node->{anchor};
}
}
}
}
unless (defined $node->{anchor}) {
my $num = ++$self->{anchor_num};
$self->{anchors}->{ $refaddr } = $num;
$node->{anchor} = $num;
}
}
else {
( run in 1.504 second using v1.01-cache-2.11-cpan-71847e10f99 )