in reply to Re: Problem with Class
in thread Problem with Class and AUTOLOAD with GTK

Thank you for the reply and for the welcome! I realized that the problem was in the AUTOLOAD (that I don't specify in the previous post). In fact, I'm trying to utilize a generic module for AUTOLOAD like this
package Autoload; use Locale::TextDomain ("kapello.it.$main::PROGRAM"); use Exporter; @ISA = qw (Exporter); @EXPORT = qw(AUTOLOAD); use Carp; sub AUTOLOAD{ my ($self, $newval) = @_; # Costruisco il metodo get if ($AUTOLOAD =~ /.*::get_(\w+)/){ my $property_name = $1; my $ref = ref($self->{$property_name}); if ($ref eq 'ARRAY'){ *{$AUTOLOAD} = sub { @{$self->{$property_name}} }; return @{$self->{$property_name}}; } else{ *{$AUTOLOAD} = sub { $self->{$property_name} }; return $self->{$property_name}; } } # Costruisco il metodo set if ($AUTOLOAD =~ /.*::set_(\w+)/){ my $property_name = $1; *{$AUTOLOAD} = sub { $self->{$property_name} = $newval }; return $self->{$property_name} = $newval; } # Deve esserci un errore croak __"Il metodo: $AUTOLOAD non è disponibile."; } 1;
If I create my hard coded setters and getters in module Page.pm, the problem don't arise. If I use my Autoload.pm the problem arise. ps. I modified the title in "Problem with Class and AUTOLOAD with GTK"

Replies are listed 'Best First'.
Re^3: Problem with Class
by lamprecht (Friar) on Jan 03, 2011 at 19:09 UTC
    Hi,

    the methods you install in AUTOLOAD always reference their first invocant/arg. You will have to use something like (untested):

    *{$AUTOLOAD} = sub {my ($self, $newval) = @_; $self->{$property_name} = $newval };
    Cheers, Chris
      Hi Chris! Great! I modify my Autoload.pm so ...
      package Autoload; use Locale::TextDomain ("kapello.it.$main::PROGRAM"); use Exporter; @ISA = qw (Exporter); @EXPORT = qw(AUTOLOAD); use Carp; sub AUTOLOAD{ my ($self, $newval) = @_; # Costruisco il metodo get if ($AUTOLOAD =~ /.*::get_(\w+)/){ my $property_name = $1; my $ref = ref($self->{$property_name}); if ($ref eq 'ARRAY'){ *{$AUTOLOAD} = sub { my ($self) = @_; @{$self->{$property_ +name}} }; my ($self) = @_; return @{$self->{$property_name}}; } else{ *{$AUTOLOAD} = sub {my ($self) = @_; $self->{$property_nam +e}}; my ($self) = @_; return $self->{$property_name}; } } # Costruisco il metodo set if ($AUTOLOAD =~ /.*::set_(\w+)/){ my $property_name = $1; *{$AUTOLOAD} = sub {my ($self, $newval) = @_; $self->{$propert +y_name} = $newval }; my ($self, $newval) = @_; return $self->{$property_name} = $newval; } # Deve esserci un errore croak __"Il metodo: $AUTOLOAD non è disponibile."; } 1;
      and seems works !!! Thank you!! ps. for now some test ... :-)