How do you handle static abilities?

As far as I can see, there are 2 ways:
1. At each "moment" of game time (basically whenever the game considers an atomic action to have occurred), you go through all curently active static abilities (in play, in the graveyard (Riftstone Portal)) and perform their modification. This is very straightforward (reset all cards at each point, add any relevant changes from static abilities) and is more correct from a rules standpoint, but seems very inefficient (especially if you build a search based AI). One side benefit is that timestamps are properly maintained, and conditional static abilities are pretty easy ("[cardname] gains +1/+1 while it is red")
2. Static abilities add or remove their modifications to cards at definite times in the game (for example, when coming into play or leaving play, if the static ability modifies other cards, then it is notified whenever a new card matching its criteria enters or leaves play). This requires an event system (but then again, you need one for triggered abilities). This might lead to some tricky timing or ordering issues (depending on how the event system is setup), and is also less straightforward to implement. One side effect is that getting this right makes triggered abilities fairly easy (the logic is pretty much the same, except instead of creating a continuous effect, you put something on the stack that resolves later).
Incantus currently uses the second approach. It took a while to get the timing right, but now it works pretty well.
What do the other programs do? Anybody have other approaches?
1. At each "moment" of game time (basically whenever the game considers an atomic action to have occurred), you go through all curently active static abilities (in play, in the graveyard (Riftstone Portal)) and perform their modification. This is very straightforward (reset all cards at each point, add any relevant changes from static abilities) and is more correct from a rules standpoint, but seems very inefficient (especially if you build a search based AI). One side benefit is that timestamps are properly maintained, and conditional static abilities are pretty easy ("[cardname] gains +1/+1 while it is red")
2. Static abilities add or remove their modifications to cards at definite times in the game (for example, when coming into play or leaving play, if the static ability modifies other cards, then it is notified whenever a new card matching its criteria enters or leaves play). This requires an event system (but then again, you need one for triggered abilities). This might lead to some tricky timing or ordering issues (depending on how the event system is setup), and is also less straightforward to implement. One side effect is that getting this right makes triggered abilities fairly easy (the logic is pretty much the same, except instead of creating a continuous effect, you put something on the stack that resolves later).
Incantus currently uses the second approach. It took a while to get the timing right, but now it works pretty well.
What do the other programs do? Anybody have other approaches?