From a79a48c06297674602f44ec367c8b2768b1c997a Mon Sep 17 00:00:00 2001 From: Rhesa Rozendaal Date: Fri, 15 Jun 2012 09:39:13 -0700 Subject: [PATCH] [perl #29230] Class::Struct, accessor overrides not called from constructor Class::Struct allows you to override the accessors it creates, but it doesn't call them in its constructor. In other words, $struct->field('blah'); calls my override, but $struct = structure->new('field' => 'blah'); doesn't. Class::Struct simply does $r->{'field'} = $init{'field'} but it would be more useful if it did $r->field($init{'field'}) --- lib/Class/Struct.pm | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/Class/Struct.pm b/lib/Class/Struct.pm index 7a9af54..a21812c 100644 --- a/lib/Class/Struct.pm +++ b/lib/Class/Struct.pm @@ -130,6 +130,9 @@ sub struct { elsif( $base_type eq 'ARRAY' ){ $out .= " my(\$r) = [];\n"; } + + $out .= " bless \$r, \$class;\n\n"; + while( $idx < @decls ){ $name = $decls[$idx]; $type = $decls[$idx+1]; @@ -150,24 +153,24 @@ sub struct { if( $type eq '@' ){ $out .= " croak 'Initializer for $name must be array reference'\n"; $out .= " if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'ARRAY';\n"; - $out .= " \$r->$elem = $init [];$cmt\n"; + $out .= " \$r->$name( $init [] );$cmt\n"; $arrays{$name}++; } elsif( $type eq '%' ){ $out .= " croak 'Initializer for $name must be hash reference'\n"; $out .= " if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'HASH';\n"; - $out .= " \$r->$elem = $init {};$cmt\n"; + $out .= " \$r->$name( $init {} );$cmt\n"; $hashes{$name}++; } elsif ( $type eq '$') { - $out .= " \$r->$elem = $init undef;$cmt\n"; + $out .= " \$r->$name( $init undef );$cmt\n"; } elsif( $type =~ /^\w+(?:::\w+)*$/ ){ $out .= " if (defined(\$init{'$name'})) {\n"; $out .= " if (ref \$init{'$name'} eq 'HASH')\n"; - $out .= " { \$r->$elem = $type->new(\%{\$init{'$name'}}) } $cmt\n"; + $out .= " { \$r->$name( $type->new(\%{\$init{'$name'}}) ) } $cmt\n"; $out .= " elsif (UNIVERSAL::isa(\$init{'$name'}, '$type'))\n"; - $out .= " { \$r->$elem = \$init{'$name'} } $cmt\n"; + $out .= " { \$r->$name( \$init{'$name'} ) } $cmt\n"; $out .= " else { croak 'Initializer for $name must be hash or $type reference' }\n"; $out .= " }\n"; $classes{$name} = $type; @@ -178,7 +181,8 @@ sub struct { } $idx += 2; } - $out .= " bless \$r, \$class;\n }\n"; + + $out .= "\n \$r;\n}\n"; # Create accessor methods. -- 2.7.4