r23490 - in /branches/upstream/libdata-visitor-perl/current: Changes META.yml Makefile.PL SIGNATURE lib/Data/Visitor.pm lib/Data/Visitor/Callback.pm t/circular_refs.t
ghostbar-guest at users.alioth.debian.org
ghostbar-guest at users.alioth.debian.org
Tue Jul 22 04:51:31 UTC 2008
Author: ghostbar-guest
Date: Tue Jul 22 04:51:28 2008
New Revision: 23490
URL: http://svn.debian.org/wsvn/pkg-perl/?sc=1&rev=23490
Log:
[svn-upgrade] Integrating new upstream version, libdata-visitor-perl (0.18)
Modified:
branches/upstream/libdata-visitor-perl/current/Changes
branches/upstream/libdata-visitor-perl/current/META.yml
branches/upstream/libdata-visitor-perl/current/Makefile.PL
branches/upstream/libdata-visitor-perl/current/SIGNATURE
branches/upstream/libdata-visitor-perl/current/lib/Data/Visitor.pm
branches/upstream/libdata-visitor-perl/current/lib/Data/Visitor/Callback.pm
branches/upstream/libdata-visitor-perl/current/t/circular_refs.t
Modified: branches/upstream/libdata-visitor-perl/current/Changes
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdata-visitor-perl/current/Changes?rev=23490&op=diff
==============================================================================
--- branches/upstream/libdata-visitor-perl/current/Changes (original)
+++ branches/upstream/libdata-visitor-perl/current/Changes Tue Jul 22 04:51:28 2008
@@ -1,3 +1,6 @@
+0.18
+ - Weak reference support
+
0.17
- More void context correctness fixes WRT tied values
- Overzealous seen value mappings made by Callback were removed
Modified: branches/upstream/libdata-visitor-perl/current/META.yml
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdata-visitor-perl/current/META.yml?rev=23490&op=diff
==============================================================================
--- branches/upstream/libdata-visitor-perl/current/META.yml (original)
+++ branches/upstream/libdata-visitor-perl/current/META.yml Tue Jul 22 04:51:28 2008
@@ -1,13 +1,16 @@
--- #YAML:1.0
name: Data-Visitor
-version: 0.17
+version: 0.18
abstract: ~
license: ~
author: ~
generated_by: ExtUtils::MakeMaker version 6.44
distribution_type: module
requires:
- Class::Accessor: 0
+ Data::Alias: 0
+ Mouse: 0.04
+ namespace::clean: 0.08
+ Task::Weaken: 0
Test::MockObject: 1.04
Test::More: 0
Test::use::ok: 0
Modified: branches/upstream/libdata-visitor-perl/current/Makefile.PL
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdata-visitor-perl/current/Makefile.PL?rev=23490&op=diff
==============================================================================
--- branches/upstream/libdata-visitor-perl/current/Makefile.PL (original)
+++ branches/upstream/libdata-visitor-perl/current/Makefile.PL Tue Jul 22 04:51:28 2008
@@ -5,11 +5,14 @@
'NAME' => 'Data::Visitor',
'VERSION_FROM' => 'lib/Data/Visitor.pm',
'PREREQ_PM' => {
- 'Class::Accessor' => '0',
+ 'Mouse' => '0.04',
+ 'namespace::clean' => '0.08',
'Test::MockObject' => '1.04',
'Test::More' => '0',
'Test::use::ok' => '0',
'Tie::ToObject' => '0.01',
+ 'Data::Alias' => '0', # deref
+ 'Task::Weaken' => '0',
},
'INSTALLDIRS' => 'site',
'PL_FILES' => {},
Modified: branches/upstream/libdata-visitor-perl/current/SIGNATURE
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdata-visitor-perl/current/SIGNATURE?rev=23490&op=diff
==============================================================================
--- branches/upstream/libdata-visitor-perl/current/SIGNATURE (original)
+++ branches/upstream/libdata-visitor-perl/current/SIGNATURE Tue Jul 22 04:51:28 2008
@@ -14,24 +14,24 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
-SHA1 0e2884144c30d1570281a34f27d49f8541518e7a Changes
+SHA1 f76d5269f3c5313694113e8b3362256c8f670336 Changes
SHA1 f0cf3ccc1cd7b0f3215f358edc7fa0099b437aba MANIFEST
SHA1 ddb918d4e02cc06f4b9fe77adeca65403f8fdd56 MANIFEST.SKIP
-SHA1 1b052f87f5a7653682e9cee2d894ddee979a3be6 META.yml
-SHA1 667bc3455c456f2f3bf2ba21eaf728c93057d253 Makefile.PL
-SHA1 a0b3f7ec66e1b212a685377b780d12bbc1449a67 lib/Data/Visitor.pm
-SHA1 f4787d6f132bc389bc9c74809969b9c6a18044af lib/Data/Visitor/Callback.pm
+SHA1 b14f53f397db61e88961db37ad435608cda2a610 META.yml
+SHA1 bd5e62254be119a314ca4ecbc82232acf7228558 Makefile.PL
+SHA1 c8c41789cb077f2b6492c0a74b77689eda948cc6 lib/Data/Visitor.pm
+SHA1 b0091166f97f2a8ec098746a3d44f3c051361eaa lib/Data/Visitor/Callback.pm
SHA1 dfba09a3df7adaf6d0369a4745e6e336272c405d t/base.t
SHA1 257c858e1bc12c1039e93cac62a0d37f2e0d804d t/bugs.t
SHA1 e4b813021fa680c61cb4229a9ddeb0a22ec5bf82 t/callback.t
SHA1 3836b0eeb006cc4984e80dec1a537b808c3173d2 t/callback_aliasing.t
-SHA1 b36e070cd6929ab17feab46e6265729c901cc394 t/circular_refs.t
+SHA1 ba502603afe759f9f22026c8c6527d1753fa6174 t/circular_refs.t
SHA1 54affd2088fa25d8eec562fb8d39e1abd0d123c7 t/globs.t
SHA1 a3a3ead5cdb91a600fb6c7ae585bfe98fcf82bbf t/magic.t
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (Darwin)
-iD8DBQFIgi+YVCwRwOvSdBgRAuauAJ4+WcizMBKaeWyFSVz9B5V7C+m2IwCfQECi
-wQy0Fj1Pbsx5EaKQHisUHDY=
-=7VJK
+iD8DBQFIhOUwVCwRwOvSdBgRApvLAKCKFXUZ3qfYxnng0OOorUj1J4TtCgCgsfgL
+8galJKWH8Cq5i8uoRRtKJGw=
+=h2wC
-----END PGP SIGNATURE-----
Modified: branches/upstream/libdata-visitor-perl/current/lib/Data/Visitor.pm
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdata-visitor-perl/current/lib/Data/Visitor.pm?rev=23490&op=diff
==============================================================================
--- branches/upstream/libdata-visitor-perl/current/lib/Data/Visitor.pm (original)
+++ branches/upstream/libdata-visitor-perl/current/lib/Data/Visitor.pm Tue Jul 22 04:51:28 2008
@@ -1,21 +1,32 @@
#!/usr/bin/perl
package Data::Visitor;
-use base qw/Class::Accessor/;
-
-use strict;
-use warnings;
-
-use Scalar::Util qw/blessed refaddr reftype/;
+use Squirrel;
+
+use Scalar::Util qw/blessed refaddr reftype weaken isweak/;
use overload ();
use Symbol ();
use Tie::ToObject;
-__PACKAGE__->mk_accessors(qw(tied_as_objects));
-
-# the double not works makes this no longer undef, so exempt from useless constant warnings in older perls
+use namespace::clean -except => 'meta';
+
+# the double not makes this no longer undef, so exempt from useless constant warnings in older perls
use constant DEBUG => not not our $DEBUG || $ENV{DATA_VISITOR_DEBUG};
+
+our $VERSION = "0.18";
+
+has tied_as_objects => (
+ isa => "Bool",
+ is => "rw",
+);
+
+# currently broken
+has weaken => (
+ isa => "Bool",
+ is => "rw",
+ default => 0,
+);
sub trace {
my ( $self, $category, @msg ) = @_;
@@ -35,8 +46,6 @@
warn "@msg\n";
}
-our $VERSION = "0.17";
-
sub visit {
my ( $self, $data ) = @_;
@@ -45,15 +54,18 @@
my $seen_hash = local $self->{_seen} = ($self->{_seen} || {}); # delete it after we're done with the whole visit
if ( ref $data ) { # only references need recursion checks
+
+ $seen_hash->{weak} ||= isweak($_[1]) if $self->weaken;
+
if ( exists $seen_hash->{ refaddr($data) } ) {
$self->trace( mapping => found_mapping => from => $data, to => $seen_hash->{ refaddr($data) } ) if DEBUG;
- return $self->visit_seen( $data, $seen_hash->{refaddr($data)} );
+ return $self->visit_seen( $_[1], $seen_hash->{refaddr($data)} );
} else {
$self->trace( mapping => no_mapping => $data ) if DEBUG;
}
}
- return $self->visit_no_rec_check( $data );
+ return $self->visit_no_rec_check( $_[1] );
}
sub visit_seen {
@@ -77,18 +89,25 @@
my ( $self, $data ) = @_;
if ( blessed($data) ) {
- return $self->visit_object($data);
+ return $self->visit_object($_[1]);
} elsif ( ref $data ) {
- return $self->visit_ref($data);
- }
-
- return $self->visit_value($data);
+ return $self->visit_ref($_[1]);
+ }
+
+ return $self->visit_value($_[1]);
}
sub visit_object {
my ( $self, $object ) = @_;
$self->trace( flow => visit_object => $object ) if DEBUG;
- return $self->_register_mapping( $object, $self->visit_value($object) );
+
+ if ( not defined wantarray ) {
+ $self->_register_mapping( $object, $object );
+ $self->visit_value($_[1]);
+ return;
+ } else {
+ return $self->_register_mapping( $object, $self->visit_value($_[1]) );
+ }
}
sub visit_ref {
@@ -104,7 +123,7 @@
my $method = $self->can(lc "visit_$reftype") || "visit_value";
- return $self->$method($data);
+ return $self->$method($_[1]);
}
sub visit_value {
@@ -123,9 +142,9 @@
my $tied = tied(%$hash);
if ( ref($tied) and $self->tied_as_objects ) {
- $self->visit_tied($tied, $hash);
- } else {
- $self->visit_hash_entries($hash);
+ $self->visit_tied(tied(%$hash), $_[1]);
+ } else {
+ $self->visit_hash_entries($_[1]);
}
return;
@@ -134,14 +153,14 @@
$self->_register_mapping( $hash, $new_hash );
my $tied = tied(%$hash);
- if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied($tied, $hash)) ) {
+ if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied(tied(%$hash), $_[1])) ) {
$self->trace( data => tying => var => $new_hash, to => $new_tied ) if DEBUG;
tie %$new_hash, 'Tie::ToObject', $new_tied;
} else {
- %$new_hash = $self->visit_hash_entries($hash);
- }
-
- return $self->retain_magic( $hash, $new_hash );
+ %$new_hash = $self->visit_hash_entries($_[1]);
+ }
+
+ return $self->retain_magic( $_[1], $new_hash );
}
}
@@ -162,11 +181,11 @@
if ( not defined wantarray ) {
$self->visit_hash_key($key,$value,$hash);
- $self->visit_hash_value($_[2],$key,$hash); # retain aliasing semantics
+ $self->visit_hash_value($_[2],$key,$hash);
} else {
return (
$self->visit_hash_key($key,$value,$hash),
- $self->visit_hash_value($_[2],$key,$hash) # retain aliasing semantics
+ $self->visit_hash_value($_[2],$key,$hash),
);
}
}
@@ -178,7 +197,7 @@
sub visit_hash_value {
my ( $self, $value, $key, $hash ) = @_;
- $self->visit($_[1]); # retain it's aliasing semantics
+ $self->visit($_[1]);
}
sub visit_array {
@@ -189,9 +208,9 @@
my $tied = tied(@$array);
if ( ref($tied) and $self->tied_as_objects ) {
- $self->visit_tied($tied, $array);
- } else {
- $self->visit_array_entries($array);
+ $self->visit_tied(tied(@$array), $_[1]);
+ } else {
+ $self->visit_array_entries($_[1]);
}
return;
@@ -200,14 +219,14 @@
$self->_register_mapping( $array, $new_array );
my $tied = tied(@$array);
- if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied($tied, $array)) ) {
+ if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied(tied(@$array), $_[1])) ) {
$self->trace( data => tying => var => $new_array, to => $new_tied ) if DEBUG;
- tie @$new_array, 'Data::Visitor::TieToObject', $new_tied;
- } else {
- @$new_array = $self->visit_array_entries($array);
- }
-
- return $self->retain_magic( $array, $new_array );
+ tie @$new_array, 'Tie::ToObject', $new_tied;
+ } else {
+ @$new_array = $self->visit_array_entries($_[1]);
+ }
+
+ return $self->retain_magic( $_[1], $new_array );
}
}
@@ -234,7 +253,7 @@
my $tied = tied($$scalar);
if ( ref($tied) and $self->tied_as_objects ) {
- $self->visit_tied($tied, $scalar);
+ $self->visit_tied(tied($$scalar), $_[1]);
} else {
$self->visit($$scalar);
}
@@ -245,20 +264,20 @@
$self->_register_mapping( $scalar, \$new_scalar );
my $tied = tied($$scalar);
- if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied($tied, $scalar)) ) {
+ if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied(tied($$scalar), $_[1])) ) {
$self->trace( data => tying => var => $new_scalar, to => $new_tied ) if DEBUG;
- tie $new_scalar, 'Data::Visitor::TieToObject', $new_tied;
+ tie $new_scalar, 'Tie::ToObject', $new_tied;
} else {
$new_scalar = $self->visit( $$scalar );
}
- return $self->retain_magic( $scalar, \$new_scalar );
+ return $self->retain_magic( $_[1], \$new_scalar );
}
}
sub visit_code {
my ( $self, $code ) = @_;
- $self->visit_value($code);
+ $self->visit_value($_[1]);
}
sub visit_glob {
@@ -269,7 +288,7 @@
my $tied = tied(*$glob);
if ( ref($tied) and $self->tied_as_objects ) {
- $self->visit_tied($tied, $glob);
+ $self->visit_tied(tied(*$glob), $_[1]);
} else {
$self->visit( *$glob{$_} || next ) for qw/SCALAR ARRAY HASH/;
}
@@ -281,15 +300,15 @@
$self->_register_mapping( $glob, $new_glob );
my $tied = tied(*$glob);
- if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied($tied, $glob)) ) {
+ if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied(tied(*$glob), $_[1])) ) {
$self->trace( data => tying => var => $new_glob, to => $new_tied ) if DEBUG;
- tie *$new_glob, 'Data::Visitor::TieToObject', $new_tied;
+ tie *$new_glob, 'Tie::ToObject', $new_tied;
} else {
no warnings 'misc'; # Undefined value assigned to typeglob
*$new_glob = $self->visit( *$glob{$_} || next ) for qw/SCALAR ARRAY HASH/;
}
- return $self->retain_magic( $glob, $new_glob );
+ return $self->retain_magic( $_[1], $new_glob );
}
}
@@ -301,6 +320,28 @@
bless $new, ref $proto;
}
+ my $seen_hash = $self->{_seen};
+ if ( $seen_hash->{weak} ) {
+ require Data::Alias;
+
+ my @weak_refs;
+ foreach my $value ( Data::Alias::deref($proto) ) {
+ if ( ref $value and isweak($value) ) {
+ push @weak_refs, refaddr $value;
+ }
+ }
+
+ if ( @weak_refs ) {
+ my %targets = map { refaddr($_) => 1 } @{ $self->{_seen} }{@weak_refs};
+ foreach my $value ( Data::Alias::deref($new) ) {
+ if ( ref $value and $targets{refaddr($value)}) {
+ push @{ $seen_hash->{weakened} ||= [] }, $value; # keep a ref around
+ weaken($value);
+ }
+ }
+ }
+ }
+
# FIXME real magic, too
return $new;
@@ -309,10 +350,12 @@
sub visit_tied {
my ( $self, $tied, $var ) = @_;
$self->trace( flow => visit_tied => $tied ) if DEBUG;
- $self->visit($tied); # as an object eventually
-}
-
-__PACKAGE__;
+ $self->visit($_[1]); # as an object eventually
+}
+
+__PACKAGE__->meta->make_immutable if __PACKAGE__->meta->can("make_immutable");
+
+__PACKAGE__
__END__
@@ -328,15 +371,21 @@
# You probably want to use Data::Visitor::Callback for trivial things
package FooCounter;
- use base qw/Data::Visitor/;
-
- BEGIN { __PACKAGE__->mk_accessors( "number_of_foos" ) };
+ use Mouse;
+
+ extends qw(Data::Visitor);
+
+ has number_of_foos => (
+ isa => "Int",
+ is => "rw",
+ default => 0,
+ );
sub visit_value {
my ( $self, $data ) = @_;
if ( defined $data and $data eq "foo" ) {
- $self->number_of_foos( ($self->number_of_foos || 0) + 1 );
+ $self->number_of_foos( $self->number_of_foos + 1 );
}
return $data;
Modified: branches/upstream/libdata-visitor-perl/current/lib/Data/Visitor/Callback.pm
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdata-visitor-perl/current/lib/Data/Visitor/Callback.pm?rev=23490&op=diff
==============================================================================
--- branches/upstream/libdata-visitor-perl/current/lib/Data/Visitor/Callback.pm (original)
+++ branches/upstream/libdata-visitor-perl/current/lib/Data/Visitor/Callback.pm Tue Jul 22 04:51:28 2008
@@ -1,19 +1,38 @@
#!/usr/bin/perl
package Data::Visitor::Callback;
-use base qw/Data::Visitor/;
-
-use strict;
-use warnings;
+use Squirrel;
+
+use Data::Visitor ();
use Carp qw(carp);
use Scalar::Util qw/blessed refaddr reftype/;
-__PACKAGE__->mk_accessors( qw/callbacks class_callbacks ignore_return_values/ );
+use namespace::clean -except => 'meta';
use constant DEBUG => Data::Visitor::DEBUG();
use constant FIVE_EIGHT => ( $] >= 5.008 );
+extends qw(Data::Visitor);
+
+has callbacks => (
+ isa => "HashRef",
+ is => "rw",
+ default => sub { {} },
+);
+
+has class_callbacks => (
+ isa => "ArrayRef",
+ is => "rw",
+ default => sub { [] },
+);
+
+has ignore_return_values => (
+ isa => "Bool",
+ is => "rw",
+);
+
+# FIXME BUILDARGS
sub new {
my ( $class, %callbacks ) = @_;
@@ -121,6 +140,23 @@
$data;
}
+sub visit_scalar {
+ my ( $self, $data ) = @_;
+ my $new_data = $self->callback_and_reg( scalar => $data );
+ if ( (reftype($new_data)||"") =~ /^(?: SCALAR | REF | LVALUE | VSTRING ) $/x ) {
+ my $visited = $self->SUPER::visit_scalar( $new_data );
+
+ no warnings "uninitialized";
+ if ( refaddr($visited) != refaddr($data) ) {
+ return $self->_register_mapping( $data, $visited );
+ } else {
+ return $visited;
+ }
+ } else {
+ return $self->_register_mapping( $data, $self->visit( $new_data ) );
+ }
+}
+
sub subname { $_[1] }
BEGIN {
@@ -130,7 +166,7 @@
*subname = \&Sub::Name::subname;
};
- foreach my $reftype ( qw/array hash glob scalar code/ ) {
+ foreach my $reftype ( qw/array hash glob code/ ) {
my $name = "visit_$reftype";
no strict 'refs';
*$name = subname(__PACKAGE__ . "::$name", eval '
@@ -186,7 +222,9 @@
$self->SUPER::visit_tied( $self->callback_and_reg( tied => $tied, @args ), @args );
}
-__PACKAGE__;
+__PACKAGE__->meta->make_immutable if __PACKAGE__->meta->can("make_immutable");
+
+__PACKAGE__
__END__
@@ -203,6 +241,7 @@
my $v = Data::Visitor::Callback->new(
value => sub { ... },
array => sub { ... },
+ object => "visit_ref", # can also use method names
);
$v->visit( $some_perl_value );
@@ -333,6 +372,12 @@
Called on the return value of C<tied> for all tied containers. Also passes in
the variable as the second argument.
+=item seen
+
+Called for a reference value encountered a second time.
+
+Passes in the result mapping as the second argument.
+
=back
=head1 AUTHOR
Modified: branches/upstream/libdata-visitor-perl/current/t/circular_refs.t
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdata-visitor-perl/current/t/circular_refs.t?rev=23490&op=diff
==============================================================================
--- branches/upstream/libdata-visitor-perl/current/t/circular_refs.t (original)
+++ branches/upstream/libdata-visitor-perl/current/t/circular_refs.t Tue Jul 22 04:51:28 2008
@@ -3,36 +3,39 @@
use strict;
use warnings;
-use Test::More tests => 12;
+use Test::More tests => 18;
+use Scalar::Util qw(refaddr);
use ok "Data::Visitor";
use ok "Data::Visitor::Callback";
-my $structure = {
- foo => {
- bar => undef,
- },
-};
+{
+ my $structure = {
+ foo => {
+ bar => undef,
+ },
+ };
-$structure->{foo}{bar} = $structure;
+ $structure->{foo}{bar} = $structure;
-my $o = Data::Visitor->new;
+ my $o = Data::Visitor->new;
-{
- alarm 1;
- $o->visit( $structure );
- alarm 0;
- pass( "circular structures don't cause an endless loop" );
+ {
+ alarm 1;
+ $o->visit( $structure );
+ alarm 0;
+ pass( "circular structures don't cause an endless loop" );
+ }
+
+ is_deeply( $o->visit( $structure ), $structure, "Structure recreated" );
+
+ is( $structure, $structure->{foo}{bar}, "circular address" );
+
+ my $visited = $o->visit( $structure );
+
+ is( $visited, $visited->{foo}{bar}, "circular address" );
}
-
-is_deeply( $o->visit( $structure ), $structure, "Structure recreated" );
-
-is( $structure, $structure->{foo}{bar}, "circular address" );
-
-my $visited = $o->visit( $structure );
-
-is( $visited, $visited->{foo}{bar}, "circular address" );
{
my $orig = {
@@ -113,3 +116,37 @@
"seen callback",
);
}
+
+{
+ my $orig = {
+ foo => { bar => 42 },
+ };
+
+ $orig->{bar} = \( $orig->{foo}{bar} );
+
+ is( refaddr($orig->{bar}), refaddr( \( $orig->{foo}{bar} ) ), "scalar ref to hash element" );
+
+ my $copy = Data::Visitor->new->visit($orig);
+
+ is_deeply( $copy, $orig, "structures eq deeply" );
+
+ local $TODO = "hash/array elements are not yet references internally";
+ is( refaddr($copy->{bar}), refaddr( \($copy->{foo}{bar}) ), "scalar ref in copy" );
+}
+
+{
+ my $orig = {
+ foo => 42,
+ };
+
+ $orig->{bar} = \( $orig->{foo} );
+
+ is( refaddr($orig->{bar}), refaddr( \( $orig->{foo} ) ), "scalar ref to sibling hash element" );
+
+ my $copy = Data::Visitor->new->visit($orig);
+
+ is_deeply( $copy, $orig, "structures eq deeply" );
+
+ local $TODO = "hash/array elements are not yet references internally";
+ is( refaddr($copy->{bar}), refaddr( \($copy->{foo}) ), "scalar ref in copy" );
+}
More information about the Pkg-perl-cvs-commits
mailing list