 
     /**
      * Set the values in the given array on the properties held in our
-     * propertyValuesList array. This is called by the update and end 
+     * animationProperties array. This is called by the update and end 
      * functions, which are called by the Animation during the animation.
      */
     protected function applyValues(value:Object):void
     {
-        var holder:PropertyValuesHolder;
-        
-        if (propertyValuesList.length == 1)
-        {
-            holder = PropertyValuesHolder(propertyValuesList[0]);
+        var holder:AnimationProperty;
+        
+        if (animationProperties.length == 1)
+        {
+            holder = AnimationProperty(animationProperties[0]);
             setValue(holder.property, value);
         }
         else
         {
             var valueArray:Array = value as Array;
-            for (var i:int = 0; i < propertyValuesList.length; ++i)
-            {
-                holder = PropertyValuesHolder(propertyValuesList[i]);
+            for (var i:int = 0; i < animationProperties.length; ++i)
+            {
+                holder = AnimationProperty(animationProperties[i]);
                 setValue(holder.property, valueArray[i]);
             }
         }
     }
     
     /**
-     * Walk the propertyValuesList looking for null values. A null indicates
+     * @private
+     * 
+     * Utility function to determine whether a given value is 'valid',
+     * which means it's either a Number and it's not NaN, or it's not
+     * a Number and it's not null
+     */
+    private function isValidValue(value:Object):Boolean
+    {
+        return ((value is Number && !isNaN(Number(value))) ||
+            (!(value is Number) && value !== null));
+    }
+    
+    /**
+     * Walk the animationProperties looking for null values. A null indicates
      * that the value should be replaced by the current value or one that
      * is calculated from the other value and a supplied delta value.
      * 

    {
        super.play();

        if (!propertyValuesList || propertyValuesList.length == 0)
        {
            // nothing to do; at least schedule the effect to end after
            // the specified duration

import flash.events.TimerEvent;
import flash.utils.Timer;

import mx.core.ILayoutElement;
import mx.core.IVisualElement;
import mx.core.IVisualElementContainer;
import mx.core.UIComponent;
import mx.core.mx_internal;
import mx.effects.Animation;
import mx.effects.AnimationProperty;
import mx.effects.EffectInstance;
import mx.effects.interpolation.IEaser;
import mx.effects.interpolation.IInterpolator;
import mx.effects.interpolation.NumberInterpolator;
import mx.events.AnimationEvent;
import mx.layout.LayoutElementFactory;
import mx.styles.IStyleClient;

