diff options
author | 2002-10-27 22:25:13 +0000 | |
---|---|---|
committer | 2002-10-27 22:25:13 +0000 | |
commit | 79cd0b9ae197e67390710f96587afb9169e5346d (patch) | |
tree | 8952f7a8f773436ffd1169eb9ac0d56c7ce1118f /gnu/usr.bin/perl/lib/Class/Struct.pm | |
parent | stock perl 5.8.0 from CPAN (diff) | |
download | wireguard-openbsd-79cd0b9ae197e67390710f96587afb9169e5346d.tar.xz wireguard-openbsd-79cd0b9ae197e67390710f96587afb9169e5346d.zip |
Resolve conflicts, remove old files, merge local changes
Diffstat (limited to 'gnu/usr.bin/perl/lib/Class/Struct.pm')
-rw-r--r-- | gnu/usr.bin/perl/lib/Class/Struct.pm | 66 |
1 files changed, 48 insertions, 18 deletions
diff --git a/gnu/usr.bin/perl/lib/Class/Struct.pm b/gnu/usr.bin/perl/lib/Class/Struct.pm index 185a8ff142c..bad4f78165f 100644 --- a/gnu/usr.bin/perl/lib/Class/Struct.pm +++ b/gnu/usr.bin/perl/lib/Class/Struct.pm @@ -2,7 +2,7 @@ package Class::Struct; ## See POD after __END__ -use 5.005_64; +use 5.006_001; use strict; use warnings::register; @@ -14,7 +14,7 @@ require Exporter; @ISA = qw(Exporter); @EXPORT = qw(struct); -$VERSION = '0.59'; +$VERSION = '0.61'; ## Tested on 5.002 and 5.003 without class membership tests: my $CHECK_CLASS_MEMBERSHIP = ($] >= 5.003_95); @@ -163,10 +163,13 @@ sub struct { $out .= " \$r->$elem = $init undef;$cmt\n"; } elsif( $type =~ /^\w+(?:::\w+)*$/ ){ - $init = "defined(\$init{'$name'}) ? \%{\$init{'$name'}} : ()"; - $out .= " croak 'Initializer for $name must be hash reference'\n"; - $out .= " if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'HASH';\n"; - $out .= " \$r->$elem = '${type}'->new($init);$cmt\n"; + $out .= " if (defined(\$init{'$name'})) {\n"; + $out .= " if (ref \$init{'$name'} eq 'HASH')\n"; + $out .= " { \$r->$elem = $type->new(\%{\$init{'$name'}}) } $cmt\n"; + $out .= " elsif (UNIVERSAL::isa(\$init{'$name'}, '$type'))\n"; + $out .= " { \$r->$elem = \$init{'$name'} } $cmt\n"; + $out .= " else { croak 'Initializer for $name must be hash or $type reference' }\n"; + $out .= " }\n"; $classes{$name} = $type; $got_class = 1; } @@ -203,11 +206,13 @@ sub struct { if( defined $arrays{$name} ){ $out .= " my \$i;\n"; $out .= " \@_ ? (\$i = shift) : return \$r->$elem;\n"; + $out .= " if (ref(\$i) eq 'ARRAY' && !\@_) { \$r->$elem = \$i; return \$r }\n"; $sel = "->[\$i]"; } elsif( defined $hashes{$name} ){ $out .= " my \$i;\n"; - $out .= " \@_ ? (\$i = shift) : return \$r->$elem;\n"; + $out .= " \@_ ? (\$i = shift) : return \$r->$elem;\n"; + $out .= " if (ref(\$i) eq 'HASH' && !\@_) { \$r->$elem = \$i; return \$r }\n"; $sel = "->{\$i}"; } elsif( defined $classes{$name} ){ @@ -361,7 +366,7 @@ optionally preceded by a C<'*'>. The accessor method provided by C<struct> for an element depends on the declared type of the element. -=over +=over 4 =item Scalar (C<'$'> or C<'*$'>) @@ -389,6 +394,10 @@ is C<'@'>, the accessor returns the array element value. If the element type is C<'*@'>, a reference to the array element is returned. +As a special case, when the accessor is called with an array reference +as the sole argument, this causes an assignment of the whole array element. +The object reference is returned. + =item Hash (C<'%'> or C<'*%'>) The element is a hash, initialized by default to C<()>. @@ -403,11 +412,15 @@ assigned to the hash element. If the element type is C<'%'>, the accessor returns the hash element value. If the element type is C<'*%'>, a reference to the hash element is returned. +As a special case, when the accessor is called with a hash reference +as the sole argument, this causes an assignment of the whole hash element. +The object reference is returned. + =item Class (C<'Class_Name'> or C<'*Class_Name'>) The element's value must be a reference blessed to the named -class or to one of its subclasses. The element is initialized to -the result of calling the C<new> constructor of the named class. +class or to one of its subclasses. The element is not initialized +by default. The accessor's argument, if any, is assigned to the element. The accessor will C<croak> if this is not an appropriate object @@ -430,14 +443,15 @@ The initializer value for a scalar element is just a scalar value. The initializer for an array element is an array reference. The initializer for a hash is a hash reference. -The initializer for a class element is also a hash reference, and the -contents of that hash are passed to the element's own constructor. +The initializer for a class element is an object of the corresponding class, +or of one of it's subclasses, or a reference to a hash containing named +arguments to be passed to the element's constructor. See Example 3 below for an example of initialization. =head1 EXAMPLES -=over +=over 4 =item Example 1 @@ -511,9 +525,9 @@ If no initializer is specified for a particular element, its default initialization is performed instead. Initializers for non-existent elements are silently ignored. -Note that the initializer for a nested struct is specified -as an anonymous hash of initializers, which is passed on to the nested -struct's constructor. +Note that the initializer for a nested class may be specified as +an object of that class, or as a reference to a hash of initializers +that are passed on to the nested struct's constructor. use Class::Struct; @@ -535,7 +549,8 @@ struct's constructor. my $cat = Cat->new( name => 'Socks', kittens => ['Monica', 'Kenneth'], markings => { socks=>1, blaze=>"white" }, - breed => { name=>'short-hair', cross=>1 }, + breed => Breed->new(name=>'short-hair', cross=>1), + or: breed => {name=>'short-hair', cross=>1}, ); print "Once a cat called ", $cat->name, "\n"; @@ -546,7 +561,22 @@ struct's constructor. =head1 Author and Modification History -Modified by Casey Tweten, 2000-11-08, v0.59. +Modified by Damian Conway, 2001-09-10, v0.62. + + Modified implicit construction of nested objects. + Now will also take an object ref instead of requiring a hash ref. + Also default initializes nested object attributes to undef, rather + than calling object constructor without args + Original over-helpfulness was fraught with problems: + * the class's constructor might not be called 'new' + * the class might not have a hash-like-arguments constructor + * the class might not have a no-argument constructor + * "recursive" data structures didn't work well: + package Person; + struct { mother => 'Person', father => 'Person'}; + + +Modified by Casey West, 2000-11-08, v0.59. Added the ability for compile time class creation. |