http://www.mojotoad.com/sisk/dt/
Regarding the sharing of DT::TZ data across the timezone singletons, I've got an example implementation that demonstrates the principle.
At the above URL you will find some modified versions of TimeZone.pm and parse_olson. In order to test you'll have to run parse_olson in your test distro -- something like "tools/parse_olson --dir ./olson --version 2003d", presuming you've unpacked the Olson goods in ./olson. I've also included a 'tzt' script that shows some stats of the data sharing in action.
What this stuff does is share data references, sometimes arrays, sometimes of certain objects, in all of the spots where they are repeatedly used across the timezone singletons. My solution will probably set of encapsulation klaxons in many of your minds -- but so long as these singletons are relatively static objects this should not be relevant.
Some notes:
1) The data refs are handled via a _juxtaposition() class method
2) No preloading of zones or data is necessary.
3) There is a JUXTA_THRESHOLD constant that controls when this sharing behavior is invoked. Currently this is set to 25, so the sharing only starts happening if you're taking more than a walk around the world. Performance should not be impacted otherwise.
4) I'm currently taking the signatures of the data structures using Digest::MD5 and Data::Dumper. This is just the first way that came to mind, there could be better ways.
5) If we want to make dependencies on such modules optional, the sharing behavior can be made to invoke only if the requisite modules are present on the system.
6) Determining the signature of data structures could be made optional if we're willing to store the structures in a data file somewhere that could be queried at need. (not sure if I like that)
7) Coding style was off the cuff. If the behavior is deemed desirable, we can rework it more elegantly.
8) I was working off of the latest CVS versions. I'm unsure if it works with the latest CPAN release.
So if you have time and the inclination, feel free to give it a whirl.
Cheers, Matt
