I have run into this problem more then once...
Many events are only send after the core has done its work. In the case of expiring nicknames for example it means that by the time the event is send, no data in the nick still exists. If the module stores data in the ModuleData for example it means the module can't do anything anymore either.
Another example is the identify event: the event is send in the middle of the core code. So before the core has finished setting stuff like vhosts, but after setting some other things lke +r.
I think it would be very useful to have that kind of events send in different stages and it doesn't require a lot of changes either. For example sending an event before the nickname is dropped and after or before and after the nickname is identified, maybe even with a third event before the channel modes on the user are being set.
[Edited on 17-8-2007 by Viper]