      */
     private function sendAnimationEvent(eventType:String):void
     {
-        var event:AnimationEvent = new AnimationEvent(eventType);
-        event.animation = this;
-        dispatchEvent(event);                
-    }
-
-    // TODO (chaase): Make currentValue a map instead, keyed off of
-    // property string. Then the mapping between the order in currentValue
-    // and that in an effect's motion paths array is not so magical
-    /**
-     * This array holds the values as of the current frame of the Animation.
-     * The order of the values are the same as the order given in the
-     * animationProperties array
-     */
-    public var currentValue:Array = [];
+        if (_animationTarget)
+            switch (eventType) {
+                case EffectEvent.EFFECT_START:
+                    _animationTarget.animationStart(this);
+                    break;
+                case EffectEvent.EFFECT_END:
+                    _animationTarget.animationEnd(this);
+                    break;
+                case EffectEvent.EFFECT_REPEAT:
+                    _animationTarget.animationRepeat(this);
+                    break;
+                case EffectEvent.EFFECT_UPDATE:
+                    // here for completeness; usually handled in sendUpdateEvent
+                    _animationTarget.animationUpdate(this);
+                    break;
+            }
+    }
     
     /**
      * @private

     */
    private function setupInterpolation():void
    {
        if (interpolator && animationProperties)
            for (var i:int = 0; i < animationProperties.length; ++i)
                animationProperties[i].interpolator = interpolator;
    }
 
    /**

    private var resourceManager:IResourceManager =
                                    ResourceManager.getInstance();
    
    
    //--------------------------------------------------------------------------
    //
    //  Properties
    //
    //--------------------------------------------------------------------------

    /**
     * This array holds the values as of the current frame of the Animation.
     * The values are stored as map values, using property names as the key.
     */
    public var currentValue:Object;

    /**
     * The set of MotionPath objects that define the properties and values
     * that the Animation will animate over time
     */
    public var motionPaths:Array;
    
    //----------------------------------
    //  animationTarget
    //----------------------------------
    /**
     * @private
     * Storage for the animationTarget property. 
     */
    private var _animationTarget:IAnimationTarget = null;
    /**
     * The IAnimationTarget object that will be notified with all
     * start, end, repeat, and update events for this animation.
     * A value of null indicates that there is no target that will
     * be notified with these events.
     * 
     * @default null
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4
     */
    public function get animationTarget():IAnimationTarget
    {
        return _animationTarget;
    }
    public function set animationTarget(value:IAnimationTarget):void
    {
        _animationTarget = value;
    }
    
    //----------------------------------
    //  playheadTime
    //----------------------------------
    /**
     * @private
     * Storage for the animationTarget property. 
     */
    private var _playheadTime:Number;
    /**
     * The total elapsed time of the Animation, including any startDelay
     * and repetitions. For an Animation playing through its first cycle,
     * this value will equal that of <code>cycleTime</code>/
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4
     */
    public function get playheadTime():Number
    {
        return _playheadTime;
    }
    public function set playheadTime(value:Number):void
    {
        seek(value, true);
    }
    /**
     * This variable indicates whether the animation is currently
     * running or not. The value is <code>false</code> unless the animation
