kapello has asked for the wisdom of the Perl Monks concerning the following question:

Hi! I'm new here and I'm sorry for my ugly english ... The problem: I'm trying to create this class:
package Page; sub new { my ($class,%args) = @_; my $self = Tie::SecureHash->new($class); my $s = Default::Style->new(); $self->{"Page::filename"}=$args{filename} || croak __"Manca il fil +ename (obbligatorio)"; $self->{"Page::name"}=basename($args{filename}); $self->{"Page::style"}=$args{style} || "editor"; $self->{"Page::scrolled"}=Gtk2::ScrolledWindow->new (undef, undef) +; $self->{"Page::sourceview"}=Gtk2::SourceView2::View->new(); $self->{"Page::lm"}=Gtk2::SourceView2::LanguageManager->new(); $self->{"Page::sm"}=Gtk2::SourceView2::StyleSchemeManager->new(); $self->{"Page::buffer"}=$self->{sourceview}->get_buffer(); $self->{"Page::label"}=Gtk2::HBox->new($s->get_box_new_small); $self->{"Page::title"}=Gtk2::Label->new($self->get_name); $self->{"Page::button"}=Gtk2::Button->new(); $self->init(); return $self; } sub init{ my $self = shift; my $a = Default::Actions->new(); my $s = Default::Style->new(); $self->{scrolled}->add($self->get_sourceview); $self->{title}->set_tooltip_text($self->{name}); ... ... .. }
When I create the first instance it's ok. But when in the main I try to create a second instance I get this error:
Gtk-WARNING **: Attempting to add a widget with type GtkSourceView to +a container of type GtkScrolledWindow, but the widget is already insi +de a container of type GtkScrolledWindow
I think this is because of the blessing class is the same ... but the question is: How can I instantiate multiple instance of my class? Thank you!

Replies are listed 'Best First'.
Re: Problem with Class
by ELISHEVA (Prior) on Jan 03, 2011 at 17:55 UTC

    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!

      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