summaryrefslogtreecommitdiff
path: root/lib/YAML/Dumper/Base.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/YAML/Dumper/Base.pm')
-rw-r--r--lib/YAML/Dumper/Base.pm111
1 files changed, 111 insertions, 0 deletions
diff --git a/lib/YAML/Dumper/Base.pm b/lib/YAML/Dumper/Base.pm
new file mode 100644
index 0000000..23db7b1
--- /dev/null
+++ b/lib/YAML/Dumper/Base.pm
@@ -0,0 +1,111 @@
+package YAML::Dumper::Base;
+
+use YAML::Mo;
+
+use YAML::Node;
+
+# YAML Dumping options
+has spec_version => default => sub {'1.0'};
+has indent_width => default => sub {2};
+has use_header => default => sub {1};
+has use_version => default => sub {0};
+has sort_keys => default => sub {1};
+has anchor_prefix => default => sub {''};
+has dump_code => default => sub {0};
+has use_block => default => sub {0};
+has use_fold => default => sub {0};
+has compress_series => default => sub {1};
+has inline_series => default => sub {0};
+has use_aliases => default => sub {1};
+has purity => default => sub {0};
+has stringify => default => sub {0};
+has quote_numeric_strings => default => sub {0};
+
+# Properties
+has stream => default => sub {''};
+has document => default => sub {0};
+has transferred => default => sub {{}};
+has id_refcnt => default => sub {{}};
+has id_anchor => default => sub {{}};
+has anchor => default => sub {1};
+has level => default => sub {0};
+has offset => default => sub {[]};
+has headless => default => sub {0};
+has blessed_map => default => sub {{}};
+
+# Global Options are an idea taken from Data::Dumper. Really they are just
+# sugar on top of real OO properties. They make the simple Dump/Load API
+# easy to configure.
+sub set_global_options {
+ my $self = shift;
+ $self->spec_version($YAML::SpecVersion)
+ if defined $YAML::SpecVersion;
+ $self->indent_width($YAML::Indent)
+ if defined $YAML::Indent;
+ $self->use_header($YAML::UseHeader)
+ if defined $YAML::UseHeader;
+ $self->use_version($YAML::UseVersion)
+ if defined $YAML::UseVersion;
+ $self->sort_keys($YAML::SortKeys)
+ if defined $YAML::SortKeys;
+ $self->anchor_prefix($YAML::AnchorPrefix)
+ if defined $YAML::AnchorPrefix;
+ $self->dump_code($YAML::DumpCode || $YAML::UseCode)
+ if defined $YAML::DumpCode or defined $YAML::UseCode;
+ $self->use_block($YAML::UseBlock)
+ if defined $YAML::UseBlock;
+ $self->use_fold($YAML::UseFold)
+ if defined $YAML::UseFold;
+ $self->compress_series($YAML::CompressSeries)
+ if defined $YAML::CompressSeries;
+ $self->inline_series($YAML::InlineSeries)
+ if defined $YAML::InlineSeries;
+ $self->use_aliases($YAML::UseAliases)
+ if defined $YAML::UseAliases;
+ $self->purity($YAML::Purity)
+ if defined $YAML::Purity;
+ $self->stringify($YAML::Stringify)
+ if defined $YAML::Stringify;
+ $self->quote_numeric_strings($YAML::QuoteNumericStrings)
+ if defined $YAML::QuoteNumericStrings;
+}
+
+sub dump {
+ my $self = shift;
+ $self->die('dump() not implemented in this class.');
+}
+
+sub blessed {
+ my $self = shift;
+ my ($ref) = @_;
+ $ref = \$_[0] unless ref $ref;
+ my (undef, undef, $node_id) = YAML::Mo::Object->node_info($ref);
+ $self->{blessed_map}->{$node_id};
+}
+
+sub bless {
+ my $self = shift;
+ my ($ref, $blessing) = @_;
+ my $ynode;
+ $ref = \$_[0] unless ref $ref;
+ my (undef, undef, $node_id) = YAML::Mo::Object->node_info($ref);
+ if (not defined $blessing) {
+ $ynode = YAML::Node->new($ref);
+ }
+ elsif (ref $blessing) {
+ $self->die() unless ynode($blessing);
+ $ynode = $blessing;
+ }
+ else {
+ no strict 'refs';
+ my $transfer = $blessing . "::yaml_dump";
+ $self->die() unless defined &{$transfer};
+ $ynode = &{$transfer}($ref);
+ $self->die() unless ynode($ynode);
+ }
+ $self->{blessed_map}->{$node_id} = $ynode;
+ my $object = ynode($ynode) or $self->die();
+ return $object;
+}
+
+1;