     public static function callLater (fn :Function, args :Array = null) :void
     {
         _methodQueue.push([fn, args]);
-        if (!_d.hasEventListener(Event.ENTER_FRAME)) {
-            _d.addEventListener(Event.ENTER_FRAME, handleEnterFrame);
-        }
+        _t.start(); // starts the timer if it's not already running
     }
 
     /**
-     * Handle a frame event: call any queued functions.
+     * Handle a timer event: call any queued functions.
      */
-    protected static function handleEnterFrame (event :Event) :void
+    protected static function handleTimer (event :TimerEvent) :void
     {
         // swap out the working set
         var methods :Array = _methodQueue;

        }

        // If no new functions were added while we were calling the current set,
        // then remove the listener.
        if (_methodQueue.length == 0) {
            _d.removeEventListener(Event.ENTER_FRAME, handleEnterFrame);
        }
    }

    /** A display object on which we listen for ENTER_FRAME. */
    protected static var _d :Sprite = new Sprite();

    /** The currently queued functions. */
    protected static var _methodQueue :Array = [];
}
}


package com.threerings.util {

import flash.events.TimerEvent;

import flash.utils.Timer;

/**
 * A simple mechanism for queueing functions to be called on the next frame.
