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

Greetings Monks,

Unlike all the rest of the WxPerl objects, WxGrid->new() seems to return a scalar rather than a hashref (thus preventing me from subclassing it), as shown below.

use Wx qw(:everything ); use Wx::Grid; *Wx::App::OnInit = sub {1}; my $a = Wx::App->new; my $f = Wx::Frame->new( undef, -1,''); my $p= Wx::Panel->new($f,-1); my $s= Wx::ScrolledWindow->new($p,-1); #Grid derives from this my $g = Wx::Grid->new($p,-1); print "$p\n$s\n$g\n";
...which prints
Wx::Panel=HASH(0xdeadbeef) Wx::ScrolledWindow=HASH(0xbaddeed) Wx::Grid=SCALAR(0xfeeddad)
...under ActiveState 5.8.0 with WxPerl 0.15, using the 8xx PPM fom the WXPerl site.

There was no Wx_Grid defined in the distro's typemap, (everything else is a 'O_WXOBJECT') so I presumed this was the root of the problem, but as nobody here or on the WxPerl mailing list seems to have posted anything about this, I wondered if I was missing something?


Replies are listed 'Best First'.
Re: WxGrid returning a scalar
by PodMaster (Abbot) on Jul 23, 2003 at 04:22 UTC
    Yes, you didn't post on the list ;)(seeing how fresh wxPerl is, anyone who knows anything is subscribed to the list) Wx-0.15/ext/grid/typemap says:
    Wx_Grid * O_WXOBJECT wxGrid * O_WXOBJECT
    In theory, you should be able to subclass it , but those bits may not be finished yet, the readme says:
    DEPRECATIONS The following features have been deprecated and may disappear in the f +uture 1 - class->new always returning an hash reference until now calling ->new( ... ) returned an hash reference for most classes derived from Wx::Window, hence the following code worked: my $button = Wx::Button->new( ... ); $button->{attribute} = 'value'; At some point in the future this will be changed so that only _user-defined_ classes derived from Wx::Window (or from any class derived from Wx::Window) will yield an hash reference, hence the following code will not wo +rk: my $button = Wx::Button->new( ... ); my $window = Wx::Window->new( ... ); $button->{a} = 'b'; $window->{c} = 'd'; while the following code will work as it did before: my $button = MyButton->new( ... ); # MyButton ISA Wx::Button my $window = MyWindow->new( ... ); # MyWindow ISA Wx::Window $button->{a} = 'b'; $window->{c} = 'd';

    MJD says "you can't just make shit up and expect the computer to know what you mean, retardo!"
    I run a Win32 PPM repository for perl 5.6.x and 5.8.x -- I take requests (README).
    ** The third rule of perl club is a statement of fact: pod is sexy.

      Ah...that'd explain it :) The PPM didn't include the readme, so I missed that bit. I'm not sure how one is supposed to turn a scalarref into a hashref though simply by deriving a new class... if '$class->SUPER::new()' returns a scalarref, then you're stuck with that as the 'base' of the derived class, surely? (...and I *have* tried, btw, with evey single bl**din' combination of re-re-blessing multiple-inherited refs to derived hashes-of-hashrefs that I can think of...{g} )


        This looks like a bug to me. There are other subclasses of Wx::Window that don't return hash reference when subclassed. For example, Wx::STC. Please post to the mailing list

        -- simonflk