Subject: | Compile Wx constants without exporting Wx constants |
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...