     }
 
     /**
-     * Called when the Animate dispatches an AnimationEvent.
-     * If you override this method, ensure that you call the super method.
+     * @private
+     * Track number of listeners to update event for optimization purposes
+     */
+    override public function addEventListener(type:String, listener:Function, 
+        useCapture:Boolean=false, priority:int=0, 
+        useWeakReference:Boolean=false):void
+    {
+        super.addEventListener(type, listener, useCapture, priority, 
+            useWeakReference);
+        if (type == EffectEvent.EFFECT_UPDATE)
+            ++numUpdateListeners;
+    }
+    
+    /**
+     * @private
+     * Track number of listeners to update event for optimization purposes
+     */
+    override public function removeEventListener(type:String, listener:Function, 
+        useCapture:Boolean=false):void
+    {
+        super.removeEventListener(type, listener, useCapture);
+        if (type == EffectEvent.EFFECT_UPDATE)
+            --numUpdateListeners;
+    }
+    
+    /**
+     * @private
+     * Called when the AnimateInstance object dispatches an EffectEvent.
      *
-     * @param event An event object of type AnimationEvent.
-     *  
-     *  @langversion 3.0
-     *  @playerversion Flash 10
-     *  @playerversion AIR 1.5
-     *  @productversion Flex 4
-     */
-    protected function animationEventHandler(event:AnimationEvent):void
+     * @param event An event object of type EffectEvent.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    private function animationEventHandler(event:EffectEvent):void
     {
         dispatchEvent(event);
     }

    // a custom easer.
    private static var defaultEaser:IEaser = new Sine(.5); 

    //--------------------------------------------------------------------------
    //
    // Properties
    //
    //--------------------------------------------------------------------------

    [Inspectable(category="General", arrayType="spark.effects.MotionPath")]
    /**
     * An array of AnimationProperty objects, each of which holds the
     * name of the property being animated and the values that the property
     * will take on during the animation. This array takes precedence over
     * any helper properties that may be declared in subclasses of Animate.

    {
        if (!affectedProperties)
        {
            if (motionPaths)
            {
                affectedProperties = new Array(motionPaths.length);
                for (var i:int = 0; i < motionPaths.length; ++i)
                {
                    var effectHolder:MotionPath = MotionPath(motionPaths[i]);
                    affectedProperties[i] = effectHolder.property;
                }
            }
