     import mx.utils.DescribeTypeCache;
     import mx.utils.DescribeTypeCacheRecord;
     import mx.effects.Parallel;
+    import mx.effects.CompositeEffect;
+    import mx.effects.Sequence;
+    import mx.core.mx_internal;
+    import mx.events.EffectEvent;
+    import mx.effects.effectClasses.TweenEffectInstance;
+    import mx.effects.TweenEffect;
+    use namespace mx_internal;
 
+    /*
+     * prop Ϥ櫓褦
+     */
     public class mxTweener {
         private static const EASYING_CLASSES:Array = [
             Back, Circular, Elastic, Quartic, Sine,
             Bounce, Cubic, Exponential, Quadratic, Quintic
+        ];
+
+        private static const TWEEN_EFFECT_CLASSES:Array = [
+            AnimateProperty, Blur, Dissolve, Fade, Glow, Move, Pause, Resize, Rotate, Zoom
         ];
 
         public static const EASYING_FUNCTIONS:Object = createEasyingFunctions();

    import mx.effects.Effect;
    import mx.effects.AnimateProperty;
    import mx.effects.easing.*;
    import flash.utils.getDefinitionByName;
    import flash.utils.getQualifiedClassName;
    import mx.events.TweenEvent;

            return o;
        }

        public static function tween(... args):Effect {
            if(args.length == 1) {
                if(args[0] is Array) {
                    var par:Parallel= new Parallel;
                    for each (var options:Object in args[0]) {
                        par.addChild(factoryTween(options));
                    }
                    return par;
                } else {
                    return factoryTween(args[0]);
                }
            }
            if(args.length > 1) {
                var seq:Sequence = new Sequence;
                for each (options in args) {
                    seq.addChild(factoryTween(options));
                }
                return seq;
            }
            return new CompositeEffect;
        }

        public static function factoryTween(options:Object):Effect {
            if (options.properties) {
                return animatePropertyTween(options);
            } else {
                return effectTween(options);
            }
        }

        public static function effectTween(options:Object):Effect {
            var klass:Class;
            if(options.klass as Class) {
                klass = options.klass;
            } else {
               klass = Class(getDefinitionByName('mx.effects.' + options.klass));
            }
            var ef:Effect = new klass();

            var desc:XML = DescribeTypeCache.describeType(ef).typeDescription;
            var effectOptions:Object = {};
            var key:String;
            for (key in options) {
                if(
                    desc.variable.(@name == key).@name.toString() || 
                    desc.accessor.(@name == key && @access == 'readwrite').@name.toString()
