1 package Module::Build::YAML;
5 use vars qw($VERSION @EXPORT @EXPORT_OK);
8 @EXPORT_OK = qw(Dump Load DumpFile LoadFile);
12 my $class = ref($this) || $this;
19 shift if ($_[0] eq __PACKAGE__ || ref($_[0]) eq __PACKAGE__);
21 foreach my $item (@_) {
23 $yaml .= &_yaml_chunk("", $item);
29 shift if ($_[0] eq __PACKAGE__ || ref($_[0]) eq __PACKAGE__);
30 die "not yet implemented";
33 # This is basically copied out of YAML.pm and simplified a little.
35 shift if ($_[0] eq __PACKAGE__ || ref($_[0]) eq __PACKAGE__);
37 local $/ = "\n"; # reset special to "sane"
39 if ($filename =~ /^\s*(>{1,2})\s*(.*)$/) {
40 ($mode, $filename) = ($1, $2);
42 open my $OUT, "$mode $filename"
43 or die "Can't open $filename for writing: $!";
48 # This is basically copied out of YAML.pm and simplified a little.
50 shift if ($_[0] eq __PACKAGE__ || ref($_[0]) eq __PACKAGE__);
52 open my $IN, $filename
53 or die "Can't open $filename for reading: $!";
54 return Load(do { local $/; <$IN> });
59 my ($indent, $values) = @_;
61 my $ref = ref($values);
62 my ($value, @allkeys, %keyseen);
63 if (!$ref) { # a scalar
64 $yaml_chunk .= &_yaml_value($values) . "\n";
66 elsif ($ref eq "ARRAY") {
67 foreach $value (@$values) {
68 $yaml_chunk .= "$indent-";
71 $yaml_chunk .= " " . &_yaml_value($value) . "\n";
75 $yaml_chunk .= &_yaml_chunk("$indent ", $value);
79 else { # assume "HASH"
80 if ($values->{_order} && ref($values->{_order}) eq "ARRAY") {
81 @allkeys = @{$values->{_order}};
82 $values = { %$values };
83 delete $values->{_order};
85 push(@allkeys, sort keys %$values);
86 foreach my $key (@allkeys) {
87 next if (!defined $key || $key eq "" || $keyseen{$key});
89 $yaml_chunk .= "$indent$key:";
90 $value = $values->{$key};
93 $yaml_chunk .= " " . &_yaml_value($value) . "\n";
97 $yaml_chunk .= &_yaml_chunk("$indent ", $value);
107 if (! defined $value) {
110 # empty strings will become empty strings
111 elsif (! defined $value || $value eq "") {
114 # quote and escape strings with special values
115 elsif ($value =~ /["'`~\n!\@\#^\&\*\(\)\{\}\[\]\|<>\?]/) {
116 if ($value !~ /['`~\n!\#^\&\*\(\)\{\}\[\]\|\?]/) { # nothing but " or @ or < or > (email addresses)
117 return("'" . $value . "'");
120 $value =~ s/\n/\\n/g; # handle embedded newlines
121 $value =~ s/"/\\"/g; # handle embedded quotes
122 return('"' . $value . '"');
125 # allow simple scalars (without embedded quote chars) to be unquoted
126 # (includes $%_+=-\;:,./)
138 Module::Build::YAML - Provides just enough YAML support so that Module::Build works even if YAML.pm is not installed
142 use Module::Build::YAML;
148 Provides just enough YAML support so that Module::Build works even if YAML.pm is not installed.
150 Currently, this amounts to the ability to write META.yml files when "perl Build distmeta"
151 is executed via the Dump() and DumpFile() functions/methods.
155 Stephen Adkins <spadkins@gmail.com>
159 Copyright (c) 2006. Stephen Adkins. All rights reserved.
161 This program is free software; you can redistribute it and/or modify it
162 under the same terms as Perl itself.
164 See L<http://www.perl.com/perl/misc/Artistic.html>