in reply to Problem with Class and AUTOLOAD with GTK

If Gtk is doing the warning, then the problem is in the way you are using Gtk not Tie::SecureHash. Despite the fact that Tie::SecureHash->new() takes "class" as a parameter, it creates a new object each time. The place to look is in the Gtk code that is creating values to assign to class members, not Tie::SecureHash.

I'm not a Gtk expert, so someone else will have to take this problem from here. As a starting point, you might consider looking up the error you are getting in the Gtk docs and on the web via google.

Also you might consider renaming your node so that those with Gtk expertise may find it more easily, perhaps something like "Problem creating class instances with Gtk".

And ... welcome to PerlMonks!

Replies are listed 'Best First'.
Re^2: Problem with Class
by kapello (Initiate) on Jan 03, 2011 at 18:36 UTC
    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"
      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 ... :-)