At TPC, we got a new version of Date::ICal out. Actually, about 3 of them. This was a complete rewrite of Date::ICal, in order to change the internals around and make it easier to work with.
The internals were icky, contained a lot of redundant code, and stored the date in several formats at the same time. So if you changed one, you had to make sure to go around and change all the others also.
Now there's just one authoritative internal format, and the other attributes are calculated from that.
Two changes that are still under consideration are:
1) Use Memoize to make sure that we are not recalculating the same stuff over and over. For example, when you call $obj->ical, it calls $obj->year, $obj->month, and $obj->day. Each of those, in turn, calls parsedays to get that attribute frome the julian date. That's just silly, since you end up parsing the date three times to get the ical string. Using Memoize will remove that, and speed things up by 3 in a lot of places.
2) Split the date/time floating point number into a date integer, and a time integer. We're getting round-off errors of a second, and that's just not acceptable. Splitting into two values will remove the roundoff, and be accurate for another 100,000 years or so. Should be sufficient.