Tue Jun 22 07:27:02 2010: Request 58579 was acted upon. Transaction: Ticket created by ADAMK Queue: Wx Subject: Compile Wx constants without exporting Wx constants Broken in: (no value) Severity: (no value) Owner: Nobody Requestors: ad...@cpan.org Status: new Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=58579 >
A large Wx-based application will contains dozens or hundreds of classes that need to use Wx and the constants within it. Our experience from Padre suggests that the two main ways of consuming Wx constants don't scale. Firstly, you can suck in everything. use Wx ':everything'; This is just fine for a single class, but the sheer volume of symbols results in something like 50k of memory burnt. Multiply this by 20 classes and you end up with 1meg of RAM. Multiply it by 200 classes and you get 10meg of RAM, just to use the constants. The second and more efficient option is to name the specific symbols. use Wx qw{ wxDefaultPosition wxDefaultSize }; Unfortunately, this becomes highly unweildy at scale because of the heavy need for double maintenance and all the extra code that is required for no functional effect. The only effect all this import code has is to reduce the memory cost of accessing Wx constants. The problem is that you can't avoid doing this importing even if you want to. The following does not work. use Wx (); my $value = Wx::wxDefaultPosition; And yet this alternative DOES work... use Wx ':everything'; my $value = Wx::wxDefaultPosition; In Padre, we work around this problem by having one master class import everything and in the process "stimulate" all the Wx::wxFOO constants into existing. All other Padre classes can then use any Wx::wxFOO constant with impunity. This is both computationally efficient, and reads pretty cleanly in the code itself. I would love to see some kind of similar effect implemented in Wx core itself, perhaps via a ':compile' type option. This would save Padre from importing all those symbols into Padre::Wx, and would greatly simplify code generators producing Wx code, because they don't have to track and import each constant used. Perhaps it would just be better to declare all the constants full all the time, or to declare all the constants consumed by a class (say, Wx::Dialog) by default whenever each class that can use them are loaded. It feels like there should be some way of doing this better than what is done now...