home *** CD-ROM | disk | FTP | other *** search
- package YAML::Transfer;
- use strict;
-
- use YAML::Node;
-
- package YAML::Transfer::glob;
- sub yaml_dump {
- my $ynode = YAML::Node->new({}, 'perl/glob:');
- for my $type (qw(PACKAGE NAME SCALAR ARRAY HASH CODE IO)) {
- my $value = *{$_[0]}{$type};
- $value = $$value if $type eq 'SCALAR';
- if (defined $value) {
- if ($type eq 'IO') {
- my @stats = qw(device inode mode links uid gid rdev size
- atime mtime ctime blksize blocks);
- undef $value;
- $value->{stat} = YAML::Node->new({});
- map {$value->{stat}{shift @stats} = $_} stat(*{$_[0]});
- $value->{fileno} = fileno(*{$_[0]});
- {
- local $^W;
- $value->{tell} = tell(*{$_[0]});
- }
- }
- $ynode->{$type} = $value;
- }
- }
- return $ynode;
- }
-
- package YAML::Transfer::blessed;
- my %sigil = (HASH => '', ARRAY => '@', SCALAR => '$');
- sub yaml_dump {
- my ($value) = @_;
- my ($class, $type) = YAML::Node::info($value);
- my $family = "perl/$sigil{$type}$class";
- if ($type eq 'SCALAR') {
- $_[1] = $$value;
- YAML::Node->new($_[1], $family)
- } else {
- YAML::Node->new($value, $family)
- }
- }
-
- package YAML::Transfer::code;
- my $dummy_warned = 0;
- my $default = '{ "DUMMY" }';
- sub yaml_dump {
- my $code;
- my ($dumpflag, $value) = @_;
- my ($class, $type) = YAML::Node::info($value);
- $class ||= '';
- my $family = "perl/code:$class";
- if (not $dumpflag) {
- $code = $default;
- }
- else {
- bless $value, "CODE" if $class;
- eval "use B::Deparse";
- my $deparse = B::Deparse->new();
- eval {
- local $^W = 0;
- $code = $deparse->coderef2text($value);
- };
- if ($@) {
- warn YAML::YAML_DUMP_WARN_DEPARSE_FAILED() if $^W;
- $code = $default;
- }
- bless $value, $class if $class;
- chomp $code;
- $code .= "\n";
- }
- $_[2] = $code;
- YAML::Node->new($_[2], $family);
- }
-
- package YAML::Transfer::ref;
- sub yaml_dump {
- YAML::Node->new({(&YAML::VALUE, ${$_[0]})}, 'perl/ref:')
- }
-
- package YAML::Transfer::regexp;
- # XXX Be sure to handle blessed regexps (if possible)
- sub yaml_dump {
- my ($value) = @_;
- my ($regexp, $modifiers);
- if ("$value" =~ /^\(\?(\w*)(?:\-\w+)?\:(.*)\)$/) {
- $regexp = $2;
- $modifiers = $1 || '';
- }
- else {
- croak YAML::YAML_DUMP_ERR_BAD_REGEXP($value);
- }
- my $ynode = YAML::Node->new({}, 'perl/regexp:');
- $ynode->{REGEXP} = $regexp;
- $ynode->{MODIFIERS} = $modifiers if $modifiers;
- return $ynode;
- }
-
- 1;
-