You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2014/03/12 05:36:35 UTC

[1/7] git commit: [flex-asjs] [refs/heads/develop] - need one more fake file for exporting release builds from FB

Repository: flex-asjs
Updated Branches:
  refs/heads/develop d21756911 -> e0597f0a9


need one more fake file for exporting release builds from FB


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/b606f59d
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/b606f59d
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/b606f59d

Branch: refs/heads/develop
Commit: b606f59d79c1ee0929c2ab362c7c19a02a13e48c
Parents: d217569
Author: Alex Harui <ah...@apache.org>
Authored: Mon Mar 3 10:00:29 2014 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Mar 11 21:35:59 2014 -0700

----------------------------------------------------------------------
 installer.xml | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/b606f59d/installer.xml
----------------------------------------------------------------------
diff --git a/installer.xml b/installer.xml
index 4126942..e5943a2 100644
--- a/installer.xml
+++ b/installer.xml
@@ -692,6 +692,7 @@
         <mkdir dir="${FLEXJS_HOME}/frameworks/themes/Halo" />
         <copy file="${FLEXJS_HOME}/frameworks/as/libs/MXMLCClasses.swc"
 tofile="${FLEXJS_HOME}/frameworks/themes/Halo/Halo.swc" />
+        <touch file="${FLEXJS_HOME}/frameworks/themes/Spark/spark.css" />
         <copy file="${FLEXJS_HOME}/frameworks/air-config.xml"
             tofile="${FLEXJS_HOME}/frameworks/airmobile-config.xml" />
         <touch file="${FLEXJS_HOME}/frameworks/macfonts.ser" />


[4/7] git commit: [flex-asjs] [refs/heads/develop] - changes required to get BasicTests to pass on two simple tests

Posted by ah...@apache.org.
changes required to get BasicTests to pass on two simple tests


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/89002bb0
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/89002bb0
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/89002bb0

Branch: refs/heads/develop
Commit: 89002bb0e717c1b1cf2f3676b804b396294cdba8
Parents: dec3558
Author: Alex Harui <ah...@apache.org>
Authored: Mon Mar 3 15:48:30 2014 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Mar 11 21:36:06 2014 -0700

----------------------------------------------------------------------
 .../src/org/apache/flex/core/Application.as     | 28 +++++++++++++++++++-
 .../src/org/apache/flex/core/ContainerBase.as   |  2 ++
 .../src/org/apache/flex/core/IFlexInfo.as       |  2 +-
 .../src/org/apache/flex/core/IParent.as         | 10 +++++++
 .../org/apache/flex/core/SimpleStatesImpl.as    | 20 +++++++++-----
 .../FlexJSUI/src/org/apache/flex/core/UIBase.as | 13 +++++++++
 .../src/org/apache/flex/createjs/Application.as |  2 +-
 .../org/apache/flex/createjs/core/ViewBase.as   |  4 +++
 .../apache/flex/utils/MXMLDataInterpreter.as    |  8 +++---
 .../src/org/apache/flex/utils/MixinManager.as   |  4 +--
 10 files changed, 78 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as
index 57f658d..80e3961 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as
@@ -92,6 +92,19 @@ package org.apache.flex.core
             loaderInfo.addEventListener(flash.events.Event.INIT, initHandler);
         }
 
+        
+        /**
+         *  The document property is used to provide
+         *  a property lookup context for non-display objects.
+         *  For Application, it points to itself.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+        public var document:Object = this;
+        
         private function initHandler(event:flash.events.Event):void
         {
             ValuesManager.valuesImpl = valuesImpl;
@@ -102,6 +115,7 @@ package org.apache.flex.core
             initialView.applicationModel =  model;
     	    this.addElement(initialView);
     	    dispatchEvent(new Event("viewChanged"));
+            dispatchEvent(new Event("applicationComplete"));
         }
 
         /**
@@ -275,7 +289,7 @@ package org.apache.flex.core
          *  @playerversion AIR 2.6
          *  @productversion FlexJS 0.0
          */
-        public function get info():Object
+        public function info():Object
         {
             if (!_info)
             {
@@ -359,5 +373,17 @@ package org.apache.flex.core
                 removeChild(c as DisplayObject);
         }
         
+        /**
+         *  @copy org.apache.flex.core.IParent#numElements
+         * 
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+        public function get numElements():int
+        {
+            return numChildren;
+        }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/ContainerBase.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/ContainerBase.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/ContainerBase.as
index f13cfc4..6c32cba 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/ContainerBase.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/ContainerBase.as
@@ -134,6 +134,8 @@ package org.apache.flex.core
         public function set states(value:Array):void
         {
             _states = value;
+            _currentState = _states[0].name;
+            
 			try{
 				if (getBeadByType(IStatesImpl) == null)
 					addBead(new (ValuesManager.valuesImpl.getValue(this, "iStatesImpl")) as IBead);

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IFlexInfo.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IFlexInfo.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IFlexInfo.as
index 984ec10..637918e 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IFlexInfo.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IFlexInfo.as
@@ -38,6 +38,6 @@ package org.apache.flex.core
          *  @playerversion AIR 2.6
          *  @productversion FlexJS 0.0
          */
-		function get info():Object
+		function info():Object
 	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IParent.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IParent.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IParent.as
index 85f4663..864382a 100755
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IParent.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/IParent.as
@@ -79,5 +79,15 @@ package org.apache.flex.core
          *  @productversion FlexJS 0.0
          */
        function removeElement(c:Object):void;
+       
+       /**
+        *  The number of elements in the parent.
+        * 
+        *  @langversion 3.0
+        *  @playerversion Flash 10.2
+        *  @playerversion AIR 2.6
+        *  @productversion FlexJS 0.0
+        */
+       function get numElements():int;
 	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/SimpleStatesImpl.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/SimpleStatesImpl.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/SimpleStatesImpl.as
index 72d838d..a228c16 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/SimpleStatesImpl.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/SimpleStatesImpl.as
@@ -104,7 +104,9 @@ package org.apache.flex.core
                     var ai:AddItems = AddItems(o);
                     for each (var item:DisplayObject in ai.items)
                     {
-                        var parent:IParent = ai.document[ai.destination] as IParent;
+                        var parent:IParent = ai.document as IParent;
+                        if (ai.destination != null)
+                            parent = parent[ai.destination] as IParent;
                         parent.removeElement(item);
                     }
                     if (parent is IContainer)
@@ -133,13 +135,19 @@ package org.apache.flex.core
                     }
                     for each (var item:DisplayObject in ai.items)
                     {
-                        var parent:IParent = ai.document[ai.destination] as IParent;
+                        var parent:IParent = ai.document as IParent;
+                        if (ai.destination != null)
+                            parent = parent[ai.destination] as IParent;
                         if (ai.relativeTo != null)
                         {
-                            var child:Object = ai.document[ai.relativeTo];
-                            var index:int = parent.getElementIndex(child);
-                            if (ai.position == "after")
-                                index++;
+                            var index:int = parent.numElements;
+                            if (ai.relativeTo != null)
+                            {
+                                var child:Object = ai.document[ai.relativeTo];
+                                index = parent.getElementIndex(child);
+                                if (ai.position == "after")
+                                    index++;
+                            }
                             parent.addElementAt(item, index);
                         }
                         else

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/UIBase.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/UIBase.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/UIBase.as
index 2590735..59f9839 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/UIBase.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/UIBase.as
@@ -542,6 +542,19 @@ package org.apache.flex.core
         }
 		
         /**
+         *  @copy org.apache.flex.core.IParent#numElements
+         * 
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+        public function get numElements():int
+        {
+            return numChildren;
+        }
+        
+        /**
          *  The method called when added to a parent.  This is a good
          *  time to set up beads.
          * 

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/Application.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/Application.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/Application.as
index 2214325..dd3ed37 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/Application.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/Application.as
@@ -127,7 +127,7 @@ package org.apache.flex.createjs
 			return null;
 		}
 		
-		public function get info():Object
+		public function info():Object
 		{
 			return {};           
 		}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/core/ViewBase.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/core/ViewBase.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/core/ViewBase.as
index 195821f..40c1e14 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/core/ViewBase.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/createjs/core/ViewBase.as
@@ -81,6 +81,10 @@ package org.apache.flex.createjs.core
             removeChild(c as DisplayObject);
         }
         
+        public function get numElements():int
+        {
+            return numChildren;
+        }
 
 	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as
index 40709c3..577690d 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MXMLDataInterpreter.as
@@ -157,8 +157,8 @@ public class MXMLDataInterpreter
                     IStrand(comp).addBead(value as IBead);
             }
             var beadOffset:int = i + (m - 1) * 3;
-            if (beadOffset >= -1)
-                trace(beadOffset, data[beadOffset]);
+            //if (beadOffset >= -1)
+            //    trace(beadOffset, data[beadOffset]);
             if (m > 0 && data[beadOffset] == "beads")
             {
                 m--;
@@ -321,8 +321,8 @@ public class MXMLDataInterpreter
         
         m = data[i++]; // num props
         var beadOffset:int = i + (m - 1) * 3;
-        if (beadOffset >= -1)
-            trace(beadOffset, data[beadOffset]);
+        //if (beadOffset >= -1)
+        //      (beadOffset, data[beadOffset]);
         if (m > 0 && data[beadOffset] == "beads")
         {
             m--;

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/89002bb0/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MixinManager.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MixinManager.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MixinManager.as
index b61222e..bbac35e 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MixinManager.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/utils/MixinManager.as
@@ -67,8 +67,8 @@ public class MixinManager implements IBead
         var app:IFlexInfo = value as IFlexInfo;
         if (app)
         {
-            var mixins:Array = app.info.mixins;
-            var domain:ApplicationDomain = app.info.currentDomain;
+            var mixins:Array = app.info().mixins;
+            var domain:ApplicationDomain = app.info().currentDomain;
             for each (var mixin:String in mixins)
             {
                 var mixinClass:Object = domain.getDefinition(mixin); 


[5/7] git commit: [flex-asjs] [refs/heads/develop] - more changes to get FlexJS basic tests to pass two simple tests. Needs newer mustella.swc from SDK

Posted by ah...@apache.org.
more changes to get FlexJS basic tests to pass two simple tests.  Needs newer mustella.swc from SDK


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/abbfdf9e
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/abbfdf9e
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/abbfdf9e

Branch: refs/heads/develop
Commit: abbfdf9e4b507bc273e59762d2dabfd5661f0b47
Parents: 89002bb
Author: Alex Harui <ah...@apache.org>
Authored: Mon Mar 3 15:49:18 2014 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Mar 11 21:36:07 2014 -0700

----------------------------------------------------------------------
 build.xml                                       |  4 +-
 .../tests/basicTests/BasicTestsApp-config.xml   | 17 +++++++-
 mustella/tests/basicTests/FlexJSContext.as      | 43 ++++++++++++++++++++
 .../halo/scripts/ButtonTestScript.mxml          |  4 +-
 .../halo/scripts/CheckBoxTestScript.mxml        |  4 +-
 5 files changed, 65 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/abbfdf9e/build.xml
----------------------------------------------------------------------
diff --git a/build.xml b/build.xml
index 182ff95..1a1956a 100644
--- a/build.xml
+++ b/build.xml
@@ -1151,8 +1151,8 @@
         Tests: The current checkintests that must be run before every checkin
     -->
 
-    <target name="checkintests"  description="Run these tests before every checkin" />
-    <!--<target name="checkintests" depends="basictests-mustella" description="Run these tests before every checkin" />-->
+    <!--<target name="checkintests"  description="Run these tests before every checkin" />-->
+    <target name="checkintests" depends="basictests-mustella" description="Run these tests before every checkin" />
     <!--<target name="checkintests" depends="dependencychecker-framework,basictests-mustella,checkintests-mobile" description="Run these tests before every checkin"/-->
     
     <!--

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/abbfdf9e/mustella/tests/basicTests/BasicTestsApp-config.xml
----------------------------------------------------------------------
diff --git a/mustella/tests/basicTests/BasicTestsApp-config.xml b/mustella/tests/basicTests/BasicTestsApp-config.xml
index e87fca1..2ab123a 100644
--- a/mustella/tests/basicTests/BasicTestsApp-config.xml
+++ b/mustella/tests/basicTests/BasicTestsApp-config.xml
@@ -26,25 +26,37 @@
     -->
         <symbol>halo.scripts.ButtonTestScript</symbol>
         <symbol>halo.scripts.CheckBoxTestScript</symbol>
+    <!-- temporarily
         <symbol>halo.scripts.RadioButtonTestScript</symbol>
         <symbol>halo.scripts.TextInputTestScript</symbol>
         <symbol>halo.scripts.TextAreaTestScript</symbol>
         <symbol>halo.scripts.ComboBoxTestScript</symbol>
+    -->
         <!--<symbol>halo.scripts.ColorPickerTestScript</symbol>-->
+    <!-- temporarily
         <symbol>halo.scripts.NumericStepperTestScript</symbol>
+    -->
         <!--<symbol>halo.scripts.DateFieldTestScript</symbol>-->
         <!--<symbol>halo.scripts.MenuTestScript</symbol>-->
         <!--<symbol>halo.scripts.MenuBarTestScript</symbol>-->
         <!--<symbol>halo.scripts.FocusManagerTestScript</symbol>-->
+    <!-- temporarily
         <symbol>halo.scripts.ListAndDataGridTestScript</symbol>
+    -->
         <!--<symbol>halo.scripts.TreeTestScript</symbol>-->
+    <!-- temporarily
         <symbol>halo.scripts.ImageTestScript</symbol>
+    -->
         <!--<symbol>halo.scripts.SWFLoaderTestScript</symbol>-->
+    <!-- temporarily
         <symbol>halo.scripts.TextTestScript</symbol>
+    -->
         <!--<symbol>halo.scripts.FTETextTestScript</symbol>-->
         <!--<symbol>halo.scripts.ProgressBarTestScript</symbol>-->
+    <!-- temporarily
         <symbol>halo.scripts.SliderTestScript</symbol>
         <symbol>halo.scripts.AlertTestScript</symbol>
+    -->
         <!--<symbol>halo.scripts.TabNavigatorTestScript</symbol>-->
         <!--<symbol>halo.scripts.AccordionTestScript</symbol>-->
         <!--<symbol>halo.scripts.RPCDataBindingTestScript</symbol>-->
@@ -79,7 +91,9 @@
 	    <!--<symbol>spark.scripts.FXG2RuntimeTestScript</symbol>-->
 	    <!--<symbol>dmv.scripts.ADGTestScript</symbol>-->
 	    <!--<symbol>dmv.scripts.ODGTestScript</symbol>-->
-	    <symbol>dmv.scripts.ChartsTestScript</symbol>	
+    <!-- temporarily
+	    <symbol>dmv.scripts.ChartsTestScript</symbol>
+    -->
         <!--<symbol>spark.scripts.AnimateConstraintsTestScript</symbol>-->
         <!--<symbol>spark.scripts.ImageTestScript</symbol>-->
         <!--<symbol>spark.scripts.DateTimeFormatterTestScript</symbol>-->
@@ -98,5 +112,6 @@
         <symbol>ExitWhenDone</symbol>
         <symbol>SetShowRTE</symbol>
         <symbol>SendFormattedResultsToLog</symbol>
+        <symbol>FlexJSContext</symbol>
     </includes>
 </flex-config>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/abbfdf9e/mustella/tests/basicTests/FlexJSContext.as
----------------------------------------------------------------------
diff --git a/mustella/tests/basicTests/FlexJSContext.as b/mustella/tests/basicTests/FlexJSContext.as
new file mode 100644
index 0000000..4f03402
--- /dev/null
+++ b/mustella/tests/basicTests/FlexJSContext.as
@@ -0,0 +1,43 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package 
+{
+
+[Mixin]
+public class FlexJSContext
+{
+	public function FlexJSContext()
+	{
+		super();
+    }
+    
+    public static function init(o:Object):void
+    {
+		UnitTester.contextFunction = contextFunction;
+	}
+	
+	public static function contextFunction():Object
+	{
+		return UnitTester._root["initialView"];		
+	}
+}
+
+
+}
+

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/abbfdf9e/mustella/tests/basicTests/halo/scripts/ButtonTestScript.mxml
----------------------------------------------------------------------
diff --git a/mustella/tests/basicTests/halo/scripts/ButtonTestScript.mxml b/mustella/tests/basicTests/halo/scripts/ButtonTestScript.mxml
index 50792b9..096e528 100644
--- a/mustella/tests/basicTests/halo/scripts/ButtonTestScript.mxml
+++ b/mustella/tests/basicTests/halo/scripts/ButtonTestScript.mxml
@@ -45,8 +45,8 @@
 		<TestCase testID="SetupButtonTest">
 			<body>
 				<SetProperty target="" propertyName="currentState" value="haloButtonTest" 
-                    waitEvent="updateComplete" />
-				<AssertPropertyValue target="haloButtonTests.testButton" propertyName="label" value="test button" />
+                    waitEvent="enterFrame" />
+				<AssertPropertyValue target="haloButtonTests.testButton" propertyName="text" value="test button" />
 				<AssertPropertyValue target="haloButtonTests.testLabel" propertyName="text" value="test" />
 			</body>
 		</TestCase>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/abbfdf9e/mustella/tests/basicTests/halo/scripts/CheckBoxTestScript.mxml
----------------------------------------------------------------------
diff --git a/mustella/tests/basicTests/halo/scripts/CheckBoxTestScript.mxml b/mustella/tests/basicTests/halo/scripts/CheckBoxTestScript.mxml
index b0fa0d0..a7ad95d 100644
--- a/mustella/tests/basicTests/halo/scripts/CheckBoxTestScript.mxml
+++ b/mustella/tests/basicTests/halo/scripts/CheckBoxTestScript.mxml
@@ -45,8 +45,8 @@
 		<TestCase testID="SetupCheckBoxTest">
 			<body>
 				<SetProperty target="" propertyName="currentState" value="haloCheckBoxTest" 
-                    waitEvent="updateComplete" />
-				<AssertPropertyValue target="haloCheckBoxTests.testCheckBox" propertyName="label" value="test CheckBox" />
+                    waitEvent="enterFrame" />
+				<AssertPropertyValue target="haloCheckBoxTests.testCheckBox" propertyName="text" value="test CheckBox" />
 			</body>
 		</TestCase>
 		<TestCase testID="CheckBoxTest1">


[3/7] git commit: [flex-asjs] [refs/heads/develop] - more legacy classes need to make mustella happy. Some are stripped down to eliminate undesirable dependencies

Posted by ah...@apache.org.
more legacy classes need to make mustella happy.  Some are stripped down to eliminate undesirable dependencies


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/dec3558f
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/dec3558f
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/dec3558f

Branch: refs/heads/develop
Commit: dec3558fd2e48ffe82bbe41411c3044e80d072cd
Parents: b606f59
Author: Alex Harui <ah...@apache.org>
Authored: Mon Mar 3 15:47:15 2014 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Mar 11 21:36:03 2014 -0700

----------------------------------------------------------------------
 .../projects/MXMLCClasses/src/MXMLCClasses.as   |    4 +
 .../src/mx/binding/BindabilityInfo.as           |  279 ++++
 .../MXMLCClasses/src/mx/core/FlexGlobals.as     |   55 +
 .../MXMLCClasses/src/mx/core/IMXMLObject.as     |   61 +
 .../src/mx/core/IPropertyChangeNotifier.as      |   67 +-
 .../projects/MXMLCClasses/src/mx/core/IUID.as   |   62 +
 .../src/mx/events/PropertyChangeEvent.as        |   72 +
 .../src/mx/utils/DescribeTypeCache.as           |  172 +++
 .../src/mx/utils/DescribeTypeCacheRecord.as     |  129 ++
 .../MXMLCClasses/src/mx/utils/ObjectProxy.as    |  825 ++++++++++
 .../MXMLCClasses/src/mx/utils/ObjectUtil.as     | 1424 ++++++++++++++++++
 .../MXMLCClasses/src/mx/utils/StringUtil.as     |  364 +++++
 .../MXMLCClasses/src/mx/utils/UIDUtil.as        |  296 ++++
 .../MXMLCClasses/src/mx/utils/object_proxy.as   |   34 +
 14 files changed, 3839 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/MXMLCClasses.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/MXMLCClasses.as b/frameworks/as/projects/MXMLCClasses/src/MXMLCClasses.as
index 2bb6511..dc3661e 100644
--- a/frameworks/as/projects/MXMLCClasses/src/MXMLCClasses.as
+++ b/frameworks/as/projects/MXMLCClasses/src/MXMLCClasses.as
@@ -42,8 +42,10 @@ internal class MXMLCClasses
     import mx.binding.XMLWatcher; XMLWatcher;
     import mx.core.DeferredInstanceFromClass; DeferredInstanceFromClass;
     import mx.core.DeferredInstanceFromFunction; DeferredInstanceFromFunction;
+    import mx.core.FlexGlobals; FlexGlobals;
     import mx.core.IDeferredInstance; IDeferredInstance;
     import mx.core.IFlexModuleFactory; IFlexModuleFactory;
+    import mx.core.IMXMLObject; IMXMLObject;
     import mx.core.IPropertyChangeNotifier; IPropertyChangeNotifier;
     import mx.core.IStateClient2; IStateClient2;
     import mx.core.mx_internal; use namespace mx_internal;
@@ -54,6 +56,8 @@ internal class MXMLCClasses
     import mx.styles.CSSStyleDeclaration; CSSStyleDeclaration;
     import mx.styles.IStyleManager2; IStyleManager2;
     import mx.styles.StyleManager; StyleManager;    
+    import mx.utils.ObjectUtil; ObjectUtil;
+    import mx.utils.StringUtil; StringUtil;
 }
 
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/binding/BindabilityInfo.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/binding/BindabilityInfo.as b/frameworks/as/projects/MXMLCClasses/src/mx/binding/BindabilityInfo.as
new file mode 100644
index 0000000..1d48569
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/binding/BindabilityInfo.as
@@ -0,0 +1,279 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.binding
+{
+
+import mx.events.PropertyChangeEvent;
+
+[ExcludeClass]
+
+/**
+ *  @private
+ *  Bindability information for children (properties or methods)
+ *  of a given class, based on the describeType() structure for that class.
+ */
+public class BindabilityInfo
+{
+
+	//--------------------------------------------------------------------------
+	//
+	//  Class constants
+	//
+	//--------------------------------------------------------------------------
+	
+	/**
+	 *  Name of [Bindable] metadata.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	public static const BINDABLE:String = "Bindable";
+	
+	/**
+	 *  Name of [Managed] metadata.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	public static const MANAGED:String = "Managed";
+	
+	/**
+	 *  Name of [ChangeEvent] metadata.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	public static const CHANGE_EVENT:String = "ChangeEvent";
+	
+	/**
+	 *  Name of [NonCommittingChangeEvent] metadata.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	public static const NON_COMMITTING_CHANGE_EVENT:String =
+		"NonCommittingChangeEvent";
+
+	/**
+	 *  Name of describeType() <accessor> element.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	public static const ACCESSOR:String = "accessor";
+	
+	/**
+	 *  Name of describeType() <method> element.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	public static const METHOD:String = "method";
+
+	//--------------------------------------------------------------------------
+	//
+	//  Constructor
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  Constructor.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	public function BindabilityInfo(typeDescription:XML)
+	{
+		super();
+
+		this.typeDescription = typeDescription;
+	}
+
+	//--------------------------------------------------------------------------
+	//
+	//  Variables
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 */
+	private var typeDescription:XML;
+	
+	/**
+	 *  @private
+	 *  event name -> true
+	 */
+	private var classChangeEvents:Object;
+	
+	/**
+	 *  @private
+	 *  child name -> { event name -> true }
+	 */
+	private var childChangeEvents:Object = {};	
+
+	//--------------------------------------------------------------------------
+	//
+	//  Variables
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  Object containing { eventName: true } for each change event
+	 *  (class- or child-level) that applies to the specified child.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	public function getChangeEvents(childName:String):Object
+	{
+		var changeEvents:Object = childChangeEvents[childName];
+
+		if (!changeEvents)
+		{
+			// Seed with class-level events.
+			changeEvents = copyProps(getClassChangeEvents(), {});
+
+			// Get child-specific events.
+			var childDesc:XMLList =
+				typeDescription.accessor.(@name == childName) +
+				typeDescription.method.(@name == childName);
+			
+			var numChildren:int = childDesc.length();
+
+			if (numChildren == 0)
+			{
+				// we've been asked for events on an unknown property
+				if (!typeDescription.@dynamic)
+				{
+					trace("warning: no describeType entry for '" +
+						  childName + "' on non-dynamic type '" +
+						  typeDescription.@name + "'");
+				}
+			}
+			else
+			{
+				if (numChildren > 1)
+				{
+					trace("warning: multiple describeType entries for '" +
+						  childName + "' on type '" + typeDescription.@name +
+						  "':\n" + childDesc);
+				}
+
+				addBindabilityEvents(childDesc.metadata, changeEvents);
+			}
+
+			childChangeEvents[childName] = changeEvents;
+		}
+
+		return changeEvents;
+	}
+
+	/**
+	 *  @private
+	 *  Build or return cached class change events object.
+	 */
+	private function getClassChangeEvents():Object
+	{
+		if (!classChangeEvents)
+		{
+			classChangeEvents = {};
+
+			addBindabilityEvents(typeDescription.metadata, classChangeEvents);
+
+			// Class-level [Managed] means all properties
+			// dispatch propertyChange.
+			if (typeDescription.metadata.(@name == MANAGED).length() > 0)
+			{
+				classChangeEvents[PropertyChangeEvent.PROPERTY_CHANGE] = true;
+			}
+		}
+
+		return classChangeEvents;
+	}
+
+	/**
+	 *  @private
+	 */
+	private function addBindabilityEvents(metadata:XMLList,
+										  eventListObj:Object):void
+	{
+		addChangeEvents(metadata.(@name == BINDABLE), eventListObj, true);
+		addChangeEvents(metadata.(@name == CHANGE_EVENT), eventListObj, true);
+		addChangeEvents(metadata.(@name == NON_COMMITTING_CHANGE_EVENT),
+						eventListObj, false);
+	}
+
+	/**
+	 *  @private
+	 *  Transfer change events from a list of change-event-carrying metadata
+	 *  to an event list object.
+	 *  Note: metadata's first arg value is assumed to be change event name.
+	 */
+	private function addChangeEvents(metadata:XMLList, eventListObj:Object, isCommit:Boolean):void
+	{
+		for each (var md:XML in metadata)
+		{
+			var arg:XMLList = md.arg;
+			if (arg.length() > 0)
+			{
+				var eventName:String = arg[0].@value;
+				eventListObj[eventName] = isCommit;
+			}
+			else
+			{
+				trace("warning: unconverted Bindable metadata in class '" +
+					  typeDescription.@name + "'");
+			}
+		}
+	}
+
+	/**
+	 *  @private
+	 *  Copy properties from one object to another.
+	 */
+	private function copyProps(from:Object, to:Object):Object
+	{
+		for (var propName:String in from)
+		{
+			to[propName] = from[propName];
+		}
+
+		return to;
+	}
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/core/FlexGlobals.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/core/FlexGlobals.as b/frameworks/as/projects/MXMLCClasses/src/mx/core/FlexGlobals.as
new file mode 100644
index 0000000..b07a5d2
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/core/FlexGlobals.as
@@ -0,0 +1,55 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.core
+{
+
+/**
+ *  A class that contains variables that are global to all applications within
+ *  the same ApplicationDomain.
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ *
+ */
+public class FlexGlobals
+{
+    //--------------------------------------------------------------------------
+    //
+    //  Class variables
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  The first application run in an ApplicationDomain is the top-level application.
+     *  This property is set to a reference to the top-level application in the top-level 
+     *  application's constructor. Each ApplicationDomain will have its own 
+     *  <code>topLevelApplication</code>.
+     * 
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+	public static var topLevelApplication:Object;
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/core/IMXMLObject.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/core/IMXMLObject.as b/frameworks/as/projects/MXMLCClasses/src/mx/core/IMXMLObject.as
new file mode 100644
index 0000000..9b6ec90
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/core/IMXMLObject.as
@@ -0,0 +1,61 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.core
+{
+
+/**
+ *  The IMXMLObject interface defines the APIs that a non-visual component
+ *  must implement in order to work properly with the MXML compiler.
+ *  Currently, the only supported method is the <code>initialized()</code>
+ *  method.
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+public interface IMXMLObject
+{
+	//--------------------------------------------------------------------------
+	//
+	//  Methods
+	//
+	//--------------------------------------------------------------------------
+
+    /**
+     *  Called after the implementing object has been created and all
+	 *  component properties specified on the MXML tag have been initialized.
+	 *
+     *  @param document The MXML document that created this object.
+	 *
+     *  @param id The identifier used by <code>document</code> to refer
+	 *  to this object.
+	 *  If the object is a deep property on <code>document</code>,
+	 *  <code>id</code> is null.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    function initialized(document:Object, id:String):void;
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/core/IPropertyChangeNotifier.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/core/IPropertyChangeNotifier.as b/frameworks/as/projects/MXMLCClasses/src/mx/core/IPropertyChangeNotifier.as
index 39d86ed..fbef45e 100644
--- a/frameworks/as/projects/MXMLCClasses/src/mx/core/IPropertyChangeNotifier.as
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/core/IPropertyChangeNotifier.as
@@ -20,13 +20,70 @@
 package mx.core
 {
 
+import flash.events.IEventDispatcher;
+
 /**
- * @private
- * This class is used to satisfy old MXML codegen
- * for both Falcon and MXML, but in FlexJS with mxml.children-as-data output
- * it isn't needed so there is no JS equivalent
+ *  The <code>IPropertyChangeNotifier</code> interface defines a marker 
+ *  interface.
+ *  Classes that support this interface declare support for event propagation
+ *  in a specialized manner.
+ *  Classes that implement this interface must dispatch events for each property
+ *  of this class and any nested classes publicly exposed as properties.
+ *  For those properties that are anonymous (complex and not strongly typed),
+ *  implementing classes provide custom support or directly use the
+ *  ObjectProxy class.
+ *  Implementors of this interface should use the 
+ *  <code>PropertyChangeEvent.createUpdateEvent()</code> method to construct an
+ *  appropriate update event for dispatch.
+ *  @example
+ *  <code><pre>
+ *   
+ * function set myProperty(value:Object):void
+ * {
+ *    var oldValue:IPropertyChangeNotifier = _myProperty;
+ *    var newValue:IPropertyChangeNotifier = value;
+ *    
+ *    // Need to ensure to dispatch changes on the new property.
+ *    // Listeners use the source property to determine which object 
+ *    // actually originated the event.
+ *    // In their event handler code, they can tell if an event has been 
+ *    // propagated from deep within the object graph by comparing 
+ *    // event.target and event.source. If they are equal, then the property
+ *    // change is at the surface of the object. If they are not equal, the
+ *    // property change is somewhere deeper in the object graph.
+ *    newValue.addEventListener(
+ *                PropertyChangeEvent.PROPERTY_CHANGE, 
+ *                dispatchEvent);
+ * 
+ *    // need to stop listening for events from the old property
+ *    oldValue.removeEventListener(
+ *                PropertyChangeEvent.PROPERTY_CHANGE,
+ *                dispatchEvent);
+ * 
+ *    _myProperty = newValue;
+ * 
+ *    // now notify anyone that is listening
+ *    if (dispatcher.hasEventListener(PropertyChangeEvent.PROPERTY_CHANGE))
+ *    {
+ *         var event:PropertyChangeEvent = 
+ *                         PropertyChangeEvent.createUpdateEvent(
+ *                                                       this,
+ *                                                       "myProperty",
+ *                                                       newValue,
+ *                                                       oldValue);
+ *        dispatchEvent(event);
+ *     }
+ *  }
+ * 
+ *      
+ *  </pre></code>
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
  */
-public interface IPropertyChangeNotifier
+public interface IPropertyChangeNotifier extends IEventDispatcher, IUID
 {
     //--------------------------------------------------------------------------
     //

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/core/IUID.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/core/IUID.as b/frameworks/as/projects/MXMLCClasses/src/mx/core/IUID.as
new file mode 100644
index 0000000..cd0f321
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/core/IUID.as
@@ -0,0 +1,62 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.core
+{
+
+/**
+ *  The IUID interface defines the interface for objects that must have 
+ *  Unique Identifiers (UIDs) to uniquely identify the object.
+ *  UIDs do not need to be universally unique for most uses in Flex.
+ *  One exception is for messages send by data services.
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+public interface IUID
+{
+	//--------------------------------------------------------------------------
+	//
+	//  Properties
+	//
+	//--------------------------------------------------------------------------
+
+	//----------------------------------
+	//  uid
+	//----------------------------------
+	
+	/**
+	 *  The unique identifier for this object.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    function get uid():String;
+    
+    /**
+     *  @private
+     */
+    function set uid(value:String):void;
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/events/PropertyChangeEvent.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/events/PropertyChangeEvent.as b/frameworks/as/projects/MXMLCClasses/src/mx/events/PropertyChangeEvent.as
index dcb2996..47033ec 100644
--- a/frameworks/as/projects/MXMLCClasses/src/mx/events/PropertyChangeEvent.as
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/events/PropertyChangeEvent.as
@@ -73,6 +73,78 @@ public class PropertyChangeEvent extends Event
         super(type, bubbles, cancelable);
     }
 
+    //----------------------------------
+    //  kind
+    //----------------------------------
+    
+    /**
+     *  Specifies the kind of change.
+     *  The possible values are <code>PropertyChangeEventKind.UPDATE</code>,
+     *  <code>PropertyChangeEventKind.DELETE</code>, and <code>null</code>.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public var kind:String;
+    
+    //----------------------------------
+    //  newValue
+    //----------------------------------
+    
+    /**
+     *  The value of the property after the change.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public var newValue:Object;
+    
+    //----------------------------------
+    //  oldValue
+    //----------------------------------
+    
+    /**
+     *  The value of the property before the change.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public var oldValue:Object;
+    
+    //----------------------------------
+    //  property
+    //----------------------------------
+    
+    /**
+     *  A String, QName, or int specifying the property that changed.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public var property:Object;
+    
+    //----------------------------------
+    //  source
+    //----------------------------------
+    
+    /**
+     *  The object that the change occured on.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public var source:Object;
+    
 }
 
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCache.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCache.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCache.as
new file mode 100644
index 0000000..1517b55
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCache.as
@@ -0,0 +1,172 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.utils
+{
+
+import flash.utils.describeType;
+import flash.utils.getDefinitionByName;
+import flash.utils.getQualifiedClassName;
+import mx.binding.BindabilityInfo;
+
+[ExcludeClass]
+
+/**
+ *  @private
+ *  DescribeTypeCache is a convenience class that is used to
+ *  cache the return values of <code>flash.utils.describeType()</code>
+ *  so that calls made subsequent times return faster.
+ *
+ *  This class also lets you set handler functions for specific value types.
+ *  These will get called when the user tries to access these values on
+ *  the <code>DescribeTypeCacheRecord</code> class.
+ *
+ *  @see mx.utils.DescribeTypeCacheRecord
+ */
+public class DescribeTypeCache
+{
+
+    //--------------------------------------------------------------------------
+    //
+    //  Class initialization
+    //
+    //--------------------------------------------------------------------------
+
+    registerCacheHandler("bindabilityInfo", bindabilityInfoHandler);
+
+    //--------------------------------------------------------------------------
+    //
+    //  Class variables
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  @private
+     */
+    private static var typeCache:Object = {};
+
+    /**
+     *  @private
+     */
+    private static var cacheHandlers:Object = {};
+
+    //--------------------------------------------------------------------------
+    //
+    //  Class methods
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  Calls <code>flash.utils.describeType()</code> for the first time and caches
+         *  the return value so that subsequent calls return faster.
+         *
+         *  @param o Can be either a string describing a fully qualified class name or any
+         *  ActionScript value, including all available ActionScript types, object instances,
+         *  primitive types (such as <code>uint</code>), and class objects.
+         *
+         *  @return Returns the cached record.
+         *
+         *  @see flash.utils#describeType()
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function describeType(o:*):DescribeTypeCacheRecord
+    {
+        var className:String;
+        var cacheKey:String;
+
+        if (o is String)
+            cacheKey = className = o;
+        else
+            cacheKey = className = getQualifiedClassName(o);
+
+        //Need separate entries for describeType(Foo) and describeType(myFoo)
+        if (o is Class)
+            cacheKey += "$";
+
+        if (cacheKey in typeCache)
+        {
+            return typeCache[cacheKey];
+        }
+        else
+        {
+            if (o is String)
+            {
+                try
+                {
+                    o = getDefinitionByName(o);
+                }
+                catch (error:ReferenceError)
+                {
+                    // The o parameter doesn't refer to an ActionScript 
+                    // definition, it's just a string value.
+                }
+            }
+            var typeDescription:XML = flash.utils.describeType(o);
+            var record:DescribeTypeCacheRecord = new DescribeTypeCacheRecord();
+            record.typeDescription = typeDescription;
+            record.typeName = className;
+            typeCache[cacheKey] = record;
+
+            return record;
+        }
+    }
+
+    /**
+     *  registerCacheHandler lets you add function handler for specific strings.
+         *  These functions get called when the user refers to these values on a
+         *  instance of <code>DescribeTypeCacheRecord</code>.
+     *
+     *  @param valueName String that specifies the value for which the handler must be set.
+         *  @param handler Function that should be called when user references valueName.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function registerCacheHandler(valueName:String, handler:Function):void
+    {
+        cacheHandlers[valueName] = handler;
+    }
+
+    /**
+     *  @private
+     */
+    internal static function extractValue(valueName:String, record:DescribeTypeCacheRecord):*
+    {
+        if (valueName in cacheHandlers)
+            return cacheHandlers[valueName](record);
+
+        return undefined;
+    }
+
+    /**
+     *  @private
+     */
+    private static function bindabilityInfoHandler(record:DescribeTypeCacheRecord):*
+    {
+        return new BindabilityInfo(record.typeDescription);
+    }
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCacheRecord.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCacheRecord.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCacheRecord.as
new file mode 100644
index 0000000..ea17f6c
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/DescribeTypeCacheRecord.as
@@ -0,0 +1,129 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.utils 
+{
+
+import flash.utils.Proxy;
+import flash.utils.flash_proxy;
+
+use namespace flash_proxy;
+
+[ExcludeClass]
+
+/**
+ *  @private
+ *  This class represents a single cache entry, this gets created
+ *  as part of the <code>describeType</code> method call on the 
+ *  <code>DescribeTypeCache</code>  class.
+ */
+
+public dynamic class DescribeTypeCacheRecord extends Proxy
+{
+    //--------------------------------------------------------------------------
+    //
+    //  Class variables
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  @private
+     */
+    private var cache:Object = {};
+    
+    //--------------------------------------------------------------------------
+    //
+    //  Class properties
+    //
+    //--------------------------------------------------------------------------
+
+    //----------------------------------
+    //  typeDescription
+    //----------------------------------
+
+    /**
+     *  @private
+     */
+    public var typeDescription:XML;
+    
+    //----------------------------------
+    //  typeName
+    //----------------------------------
+
+    /**
+     *  @private
+     */
+    public var typeName:String;
+
+    //--------------------------------------------------------------------------
+    //
+    //  Constructor
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  @private
+     */
+    public function DescribeTypeCacheRecord()
+    {
+        super();
+    }
+
+    //--------------------------------------------------------------------------
+    //
+    //  Overridden methods
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  @private
+     */
+    override flash_proxy function getProperty(name:*):*
+    {
+        var result:* = cache[name];
+        
+        if (result === undefined)
+        {
+            result = DescribeTypeCache.extractValue(name, this);
+            cache[name] = result;
+        }
+        
+        return result;
+    }
+
+    /**
+     *  @private
+     */
+    override flash_proxy function hasProperty(name:*):Boolean
+    {
+        if (name in cache)
+            return true;
+        
+        var value:* = DescribeTypeCache.extractValue(name, this);       
+        
+        if (value === undefined)
+            return false;
+        
+        cache[name] = value;
+        
+        return true;
+    }
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectProxy.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectProxy.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectProxy.as
new file mode 100644
index 0000000..03a8f51
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectProxy.as
@@ -0,0 +1,825 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.utils
+{
+
+import flash.events.Event;
+import flash.events.EventDispatcher;
+import flash.utils.getQualifiedClassName;
+import flash.utils.IDataInput;
+import flash.utils.IDataOutput;
+import flash.utils.IExternalizable;
+import flash.utils.Proxy;
+import flash.utils.flash_proxy;
+import mx.core.IPropertyChangeNotifier;
+import mx.events.PropertyChangeEvent;
+import mx.events.PropertyChangeEventKind;
+
+use namespace flash_proxy;
+use namespace object_proxy;
+
+[Bindable("propertyChange")]
+[RemoteClass(alias="flex.messaging.io.ObjectProxy")]
+
+/**
+ *  This class provides the ability to track changes to an item
+ *  managed by this proxy.
+ *  Any number of objects can "listen" for changes on this
+ *  object, by using the <code>addEventListener()</code> method.
+ *
+ *  @example
+ *  <pre>
+ *  import mx.events.PropertyChangeEvent;
+ *  import mx.utils.ObjectUtil;
+ *  import mx.utils.ObjectProxy;
+ *  import mx.utils.StringUtil;
+ *
+ *  var a:Object = { name: "Tyler", age: 5, ssnum: "555-55-5555" };
+ *  var p:ObjectProxy = new ObjectProxy(a);
+ *  p.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, updateHandler);
+ *  p.name = "Jacey";
+ *  p.age = 2;
+ *  delete p.ssnum;
+ *
+ *  // handler function
+ *  function updateHandler(event:ChangeEvent):void
+ *  {
+ *      trace(StringUtil.substitute("updateHandler('{0}', {1}, {2}, {3}, '{4}')",
+ *                                     event.kind,
+ *                                     event.property,
+ *                                     event.oldValue,
+ *                                     event.newValue,
+ *                                     event.target.object_proxy::UUID));
+ *  }
+ * 
+ *  // The trace output appears as:
+ *  // updateHandler('opUpdate', name, Tyler, Jacey, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
+ *  // updateHandler('opUpdate', age, 5, 2, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
+ *  // updateHandler('opDelete', ssnum, 555-55-5555, null, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
+ *  </pre>
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+public dynamic class ObjectProxy extends Proxy
+                                 implements IExternalizable,
+                                 IPropertyChangeNotifier
+{
+    //--------------------------------------------------------------------------
+    //
+    //  Constructor
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  Initializes this proxy with the specified object, id and proxy depth.
+     * 
+     *  @param item Object to proxy.
+     *  If no item is specified, an anonymous object will be constructed
+     *  and assigned.
+     *
+     *  @param uid String containing the unique id
+     *  for this object instance.
+     *  Required for IPropertyChangeNotifier compliance as every object must 
+     *  provide a unique way of identifying it.
+     *  If no value is specified, a random id will be assigned.
+     *
+     *  @param proxyDepth An integer indicating how many levels in a complex
+     *  object graph should have a proxy created during property access.
+     *  The default is -1, meaning "proxy to infinite depth".
+     *  
+     *  @example
+     *
+     *  <pre>
+     *  import mx.events.PropertyChangeEvent;
+     *  import mx.utils.ObjectUtil;
+     *  import mx.utils.ObjectProxy;
+     *  import mx.utils.StringUtil;
+     *
+     *  var a:Object = { name: "Tyler", age: 5, ssnum: "555-55-5555" };
+     *  var p:ObjectProxy = new ObjectProxy(a);
+     *  p.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, updateHandler);
+     *  p.name = "Jacey";
+     *  p.age = 2;
+     *  delete p.ssnum;
+     *
+     *  // handler function
+     *  function updateHandler(event:PropertyChangeEvent):void
+     *  {
+     *      trace(StringUtil.substitute("updateHandler('{0}', {1}, {2}, {3}, '{4}')",
+     *                                     event.kind,
+     *                                     event.property,
+     *                                     event.oldValue,
+     *                                     event.newValue,
+     *                                     event.target.uid));
+     *  }
+     *
+     *  // trace output
+     *  updateHandler('opUpdate', name, Jacey, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
+     *  updateHandler('opUpdate', age, 2, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
+     *  updateHandler('opDelete', ssnum, null, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
+     *  </pre>
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function ObjectProxy(item:Object = null, uid:String = null,
+                                proxyDepth:int = -1)
+    {
+        super();
+
+        if (!item)
+            item = {};
+        _item = item;
+
+        _proxyLevel = proxyDepth;
+       
+        notifiers = {};
+
+        dispatcher = new EventDispatcher(this);
+
+        // If we got an id, use it.  Otherwise the UID is lazily
+        // created in the getter for UID.
+        if (uid)
+            _id = uid;
+    }
+
+    //--------------------------------------------------------------------------
+    //
+    //  Variables
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  A reference to the EventDispatcher for this proxy.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    protected var dispatcher:EventDispatcher;
+
+    /**
+     *  A hashmap of property change notifiers that this proxy is 
+     *  listening for changes from; the key of the map is the property name.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    protected var notifiers:Object;
+    
+    /**
+     *  Indicates what kind of proxy to create
+     *  when proxying complex properties.
+     *  Subclasses should assign this value appropriately.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    protected var proxyClass:Class = ObjectProxy;
+    
+    /**
+     *  Contains a list of all of the property names for the proxied object.
+     *  Descendants need to fill this list by overriding the
+     *  <code>setupPropertyList()</code> method.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    protected var propertyList:Array;
+    
+    /**
+     *  Indicates how deep proxying should be performed.
+     *  If -1 (default), always proxy; 
+     *  if this value is zero, no proxying will be performed.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    private var _proxyLevel:int;
+    
+    //--------------------------------------------------------------------------
+    //
+    //  Properties
+    //
+    //--------------------------------------------------------------------------
+
+    //----------------------------------
+    //  object
+    //----------------------------------
+
+    /**
+     *  Storage for the object property.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    private var _item:Object;
+
+    /**
+     *  The object being proxied.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    object_proxy function get object():Object
+    {
+        return _item;
+    }
+
+    //----------------------------------
+    //  type
+    //----------------------------------
+
+    /**
+     *  @private
+     *  Storage for the qualified type name.
+     */
+    private var _type:QName;
+
+    /**
+     *  The qualified type name associated with this object.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    object_proxy function get type():QName
+    {
+        return _type;
+    }
+
+    /**
+     *  @private
+     */
+    object_proxy function set type(value:QName):void
+    {
+        _type = value;
+    }
+
+    //----------------------------------
+    //  uid
+    //----------------------------------
+
+    /**
+     *  @private
+     *  Storage for the uid property.
+     */
+    private var _id:String;
+
+    /**
+     *  The unique identifier for this object.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function get uid():String
+    {
+        if (_id === null)
+            _id = UIDUtil.createUID();
+            
+        return _id;
+    }
+
+    /**
+     *  @private
+     */
+    public function set uid(value:String):void
+    {
+        _id = value;
+    }
+
+    //--------------------------------------------------------------------------
+    //
+    //  Overridden methods
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  Returns the specified property value of the proxied object.
+     *
+     *  @param name Typically a string containing the name of the property,
+     *  or possibly a QName where the property name is found by 
+     *  inspecting the <code>localName</code> property.
+     *
+     *  @return The value of the property.
+     *  In some instances this value may be an instance of 
+     *  <code>ObjectProxy</code>.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    override flash_proxy function getProperty(name:*):*
+    {
+        // if we have a data proxy for this then
+        var result:*;
+
+        if (notifiers[name.toString()])
+            return notifiers[name];
+
+        result = _item[name];
+
+        if (result)
+        {
+            if (_proxyLevel == 0 || ObjectUtil.isSimple(result))
+            {
+                return result;
+            }
+            else
+            {
+                result = object_proxy::getComplexProperty(name, result);
+            } // if we are proxying
+        }
+
+        return result;
+    }
+
+    /**
+     *  Returns the value of the proxied object's method with the specified name.
+     *
+     *  @param name The name of the method being invoked.
+     *
+     *  @param rest An array specifying the arguments to the
+     *  called method.
+     *
+     *  @return The return value of the called method.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    override flash_proxy function callProperty(name:*, ... rest):*
+    {
+        return _item[name].apply(_item, rest)
+    }
+
+    /**
+     *  Deletes the specified property on the proxied object and
+     *  sends notification of the delete to the handler.
+     * 
+     *  @param name Typically a string containing the name of the property,
+     *  or possibly a QName where the property name is found by 
+     *  inspecting the <code>localName</code> property.
+     *
+     *  @return A Boolean indicating if the property was deleted.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    override flash_proxy function deleteProperty(name:*):Boolean
+    {
+        var notifier:IPropertyChangeNotifier = IPropertyChangeNotifier(notifiers[name]);
+        if (notifier)
+        {
+            notifier.removeEventListener(PropertyChangeEvent.PROPERTY_CHANGE,
+                                         propertyChangeHandler);
+            delete notifiers[name];
+        }
+
+        var oldVal:* = _item[name];
+        var deleted:Boolean = delete _item[name]; 
+
+        if (dispatcher.hasEventListener(PropertyChangeEvent.PROPERTY_CHANGE))
+        {
+            var event:PropertyChangeEvent = new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE);
+            event.kind = PropertyChangeEventKind.DELETE;
+            event.property = name;
+            event.oldValue = oldVal;
+            event.source = this;
+            dispatcher.dispatchEvent(event);
+        }
+
+        return deleted;
+    }
+
+    /**
+     *  @private
+     */
+    override flash_proxy function hasProperty(name:*):Boolean
+    {
+        return(name in _item);
+    }
+    
+    /**
+     *  @private
+     */
+    override flash_proxy function nextName(index:int):String
+    {
+        return propertyList[index -1];
+    }
+    
+    /**
+     *  @private
+     */
+    override flash_proxy function nextNameIndex(index:int):int
+    {
+        if (index == 0)
+        {
+            setupPropertyList();
+        }
+        
+        if (index < propertyList.length)
+        {
+            return index + 1;
+        }
+        else
+        {
+            return 0;
+        }
+    }
+    
+    /**
+     *  @private
+     */
+    override flash_proxy function nextValue(index:int):*
+    {
+        return _item[propertyList[index -1]];
+    }
+
+    /**
+     *  Updates the specified property on the proxied object
+     *  and sends notification of the update to the handler.
+     *
+     *  @param name Object containing the name of the property that
+     *  should be updated on the proxied object.
+     *
+     *  @param value Value that should be set on the proxied object.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    override flash_proxy function setProperty(name:*, value:*):void
+    {
+        var oldVal:* = _item[name];
+        if (oldVal !== value)
+        {
+            // Update item.
+            _item[name] = value;
+
+            // Stop listening for events on old item if we currently are.
+            var notifier:IPropertyChangeNotifier =
+                IPropertyChangeNotifier(notifiers[name]);
+            if (notifier)
+            {
+                notifier.removeEventListener(
+                    PropertyChangeEvent.PROPERTY_CHANGE,
+                    propertyChangeHandler);
+                delete notifiers[name];
+            }
+
+            // Notify anyone interested.
+            if (dispatcher.hasEventListener(PropertyChangeEvent.PROPERTY_CHANGE))
+            {
+                if (name is QName)
+                    name = QName(name).localName;
+                var event:PropertyChangeEvent =
+                    PropertyChangeEvent.createUpdateEvent(
+                        this, name.toString(), oldVal, value);
+                dispatcher.dispatchEvent(event);
+            } 
+        }
+    }
+
+    //--------------------------------------------------------------------------
+    //
+    //  object_proxy methods
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  Provides a place for subclasses to override how a complex property that
+     *  needs to be either proxied or daisy chained for event bubbling is managed.
+     * 
+     *  @param name Typically a string containing the name of the property,
+     *  or possibly a QName where the property name is found by 
+     *  inspecting the <code>localName</code> property.
+     *
+     *  @param value The property value.
+     *
+     *  @return The property value or an instance of <code>ObjectProxy</code>.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */  
+    object_proxy function getComplexProperty(name:*, value:*):*
+    {
+        if (value is IPropertyChangeNotifier)
+        {
+            value.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE,
+                                   propertyChangeHandler);
+            notifiers[name] = value;
+            return value;
+        }
+        
+        if (getQualifiedClassName(value) == "Object")
+        {
+            value = new proxyClass(_item[name], null,
+                _proxyLevel > 0 ? _proxyLevel - 1 : _proxyLevel);
+            value.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE,
+                                   propertyChangeHandler);
+            notifiers[name] = value;
+            return value;
+        }
+
+        return value;
+    }
+    
+    //--------------------------------------------------------------------------
+    //
+    //  IExternalizable Methods
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  Since Flex only uses ObjectProxy to wrap anonymous objects,
+     *  the server flex.messaging.io.ObjectProxy instance serializes itself
+     *  as a Map that will be returned as a plain ActionScript object. 
+     *  You can then set the object_proxy object property to this value.
+     *
+     *  @param input The source object from which the ObjectProxy is
+     *  deserialized. 
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function readExternal(input:IDataInput):void
+    {
+        var value:Object = input.readObject();
+        _item = value;
+    }
+
+    /**
+     *  Since Flex only serializes the inner ActionScript object that it wraps,
+     *  the server flex.messaging.io.ObjectProxy populates itself
+     *  with this anonymous object's contents and appears to the user
+     *  as a Map.
+     *
+     *  @param output The source object from which the ObjectProxy is
+     *  deserialized.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function writeExternal(output:IDataOutput):void
+    {
+        output.writeObject(_item);
+    }
+
+    //--------------------------------------------------------------------------
+    //
+    //  Methods
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  Registers an event listener object  
+     *  so that the listener receives notification of an event. 
+     *  For more information, including descriptions of the parameters see 
+     *  <code>addEventListener()</code> in the 
+     *  flash.events.EventDispatcher class.
+     *
+     *  @param type The type of event.
+     *  
+     *  @param listener The listener function that processes the event. This function must accept
+     *  an Event object as its only parameter and must return nothing.
+     *  
+     *  @param useCapture Determines whether the listener works in the capture phase or the 
+     *  target and bubbling phases. If <code>useCapture</code> is set to <code>true</code>, 
+     *  the listener processes the event only during the capture phase and not in the 
+     *  target or bubbling phase. If <code>useCapture</code> is <code>false</code>, the
+     *  listener processes the event only during the target or bubbling phase. To listen for
+     *  the event in all three phases, call <code>addEventListener</code> twice, once with 
+     *  <code>useCapture</code> set to <code>true</code>, then again with
+     *  <code>useCapture</code> set to <code>false</code>.
+     * 
+     *  @param priority The priority level of the event listener. 
+     * 
+     *  @param useWeakReference Determines whether the reference to the listener is strong or
+     *  weak. A strong reference (the default) prevents your listener from being garbage-collected.
+     *  A weak reference does not. 
+     *
+     *  @see flash.events.EventDispatcher#addEventListener()
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function addEventListener(type:String, listener:Function,
+                                     useCapture:Boolean = false,
+                                     priority:int = 0,
+                                     useWeakReference:Boolean = false):void
+    {
+        dispatcher.addEventListener(type, listener, useCapture,
+                                    priority, useWeakReference);
+    }
+
+    /**
+     *  Removes an event listener. 
+     *  If there is no matching listener registered with the EventDispatcher object, 
+     *  a call to this method has no effect.
+     *  For more information, see 
+     *  the flash.events.EventDispatcher class.
+     *  
+     *  @param type The type of event.
+     * 
+     *  @param listener The listener object to remove.
+     *
+     *  @param useCapture Specifies whether the listener was registered for the capture 
+     *  phase or the target and bubbling phases. If the listener was registered for both 
+     *  the capture phase and the target and bubbling phases, two calls to 
+     *  <code>removeEventListener()</code> are required to remove both, one call with 
+     *  <code>useCapture</code> 
+     *  set to <code>true</code>, and another call with <code>useCapture</code>
+     *  set to <code>false</code>.
+     *
+     *  @see flash.events.EventDispatcher#removeEventListener()
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function removeEventListener(type:String, listener:Function,
+                                        useCapture:Boolean = false):void
+    {
+        dispatcher.removeEventListener(type, listener, useCapture);
+    }
+
+    /**
+     *  Dispatches an event into the event flow. 
+     *  For more information, see
+     *  the flash.events.EventDispatcher class.
+     *  
+     *  @param event The Event object that is dispatched into the event flow. If the 
+     *  event is being redispatched, a clone of the event is created automatically. 
+     *  After an event is dispatched, its target property cannot be changed, so you 
+     *  must create a new copy of the event for redispatching to work.
+     *
+     *  @return Returns <code>true</code> if the event was successfully dispatched. 
+     *  A value 
+     *  of <code>false</code> indicates failure or that <code>preventDefault()</code>
+     *  was called on the event.
+     *
+     *  @see flash.events.EventDispatcher#dispatchEvent()
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function dispatchEvent(event:Event):Boolean
+    {
+        return dispatcher.dispatchEvent(event);
+    }
+    
+    /**
+     *  Checks whether there are any event listeners registered 
+     *  for a specific type of event. 
+     *  This allows you to determine where an object has altered handling 
+     *  of an event type in the event flow hierarchy. 
+     *  For more information, see
+     *  the flash.events.EventDispatcher class.
+     *
+     *  @param type The type of event
+     *
+     *  @return Returns <code>true</code> if a listener of the specified type is 
+     *  registered; <code>false</code> otherwise.
+     *
+     *  @see flash.events.EventDispatcher#hasEventListener()
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function hasEventListener(type:String):Boolean
+    {
+        return dispatcher.hasEventListener(type);
+    }
+    
+    /**
+     *  Checks whether an event listener is registered with this object 
+     *  or any of its ancestors for the specified event type. 
+     *  This method returns <code>true</code> if an event listener is triggered 
+     *  during any phase of the event flow when an event of the specified 
+     *  type is dispatched to this object or any of its descendants.
+     *  For more information, see the flash.events.EventDispatcher class.
+     *
+     *  @param type The type of event.
+     *
+     *  @return Returns <code>true</code> if a listener of the specified type will 
+     *  be triggered; <code>false</code> otherwise.
+     *
+     *  @see flash.events.EventDispatcher#willTrigger()
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function willTrigger(type:String):Boolean
+    {
+        return dispatcher.willTrigger(type);
+    }
+
+    /**
+     *  Called when a complex property is updated.
+     *
+     *  @param event An event object that has changed.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function propertyChangeHandler(event:PropertyChangeEvent):void
+    {
+        dispatcher.dispatchEvent(event);
+    }
+    
+    //--------------------------------------------------------------------------
+    //
+    //  Protected Methods
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  This method creates an array of all of the property names for the 
+     *  proxied object.
+     *  Descendants must override this method if they wish to add more 
+     *  properties to this list.
+     *  Be sure to call <code>super.setupPropertyList</code> before making any
+     *  changes to the <code>propertyList</code> property.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    protected function setupPropertyList():void
+    {
+        if (getQualifiedClassName(_item) == "Object")
+        {
+            propertyList = [];
+            for (var prop:String in _item)
+                propertyList.push(prop);
+        }
+        else
+        {
+            propertyList = ObjectUtil.getClassInfo(_item, null, {includeReadOnly:true, uris:["*"]}).properties;
+        }
+    }
+}
+
+}


[6/7] git commit: [flex-asjs] [refs/heads/develop] - clean todolist example before building release kits

Posted by ah...@apache.org.
clean todolist example before building release kits


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/686aa27b
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/686aa27b
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/686aa27b

Branch: refs/heads/develop
Commit: 686aa27b6e410707dec09c47e7c88dfbf1555a36
Parents: abbfdf9
Author: Alex Harui <ah...@apache.org>
Authored: Tue Mar 11 21:34:35 2014 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Mar 11 21:36:07 2014 -0700

----------------------------------------------------------------------
 examples/build.xml | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/686aa27b/examples/build.xml
----------------------------------------------------------------------
diff --git a/examples/build.xml b/examples/build.xml
index 081ee30..9aa255c 100644
--- a/examples/build.xml
+++ b/examples/build.xml
@@ -88,6 +88,7 @@
         <ant dir="${basedir}/StatesTest"/>
         <ant dir="${basedir}/StockQuote"/>
         <ant dir="${basedir}/BarChartExample"/>
+        <ant dir="${basedir}/TodoListSampleApp"/>
     </target>
 	   
     <!--
@@ -115,6 +116,7 @@
         <ant dir="${basedir}/StatesTest" target="clean"/>
         <ant dir="${basedir}/StockQuote" target="clean"/>
         <ant dir="${basedir}/BarChartExample" target="clean"/>
+        <ant dir="${basedir}/TodoListSampleApp" target="clean"/>
     </target>
     
 </project>


[7/7] git commit: [flex-asjs] [refs/heads/develop] - don't cache nightly falcon build

Posted by ah...@apache.org.
don't cache nightly falcon build


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/e0597f0a
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/e0597f0a
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/e0597f0a

Branch: refs/heads/develop
Commit: e0597f0a9a578d82a941f46dba8c34f990216cc8
Parents: 686aa27
Author: Alex Harui <ah...@apache.org>
Authored: Tue Mar 11 21:34:54 2014 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Mar 11 21:36:07 2014 -0700

----------------------------------------------------------------------
 installer.xml | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/e0597f0a/installer.xml
----------------------------------------------------------------------
diff --git a/installer.xml b/installer.xml
index e5943a2..9b4233a 100644
--- a/installer.xml
+++ b/installer.xml
@@ -27,7 +27,7 @@
     <!-- local.d32 is set/used in build.properties so this needs to be done first. -->
     <condition property="local.d32" value="-d32">
         <and>
-            <os family="windows"/>
+            <os family="windows"/>  
             <equals arg1="${sun.arch.data.model}" arg2="64"/>
             <equals arg1="${os.arch}" arg2="x86_64"/>
             <equals arg1="${ant.java.version}" arg2="1.6"/>
@@ -51,6 +51,7 @@
     <property name="flex.url.path" value="http://archive.apache.org/dist/flex/${flex.sdk.version}/binaries" />
     <property name="flex.url.file" value="apache-flex-sdk-${flex.sdk.version}-bin.zip" />
 
+    <!-- don't forget to re-enable caching in the falcon-get task -->
     <property name="falcon.url.path" value="https://builds.apache.org/job/flex-falcon/lastSuccessfulBuild/artifact/out/" />
     <!--<property name="falcon.url.path" value="http://archive.apache.org/dist/flex/falcon/${falcon.version}/binaries" />-->
     <property name="falcon.url.file" value="apache-flex-falconjx-${falcon.version}-bin.zip" />
@@ -269,6 +270,7 @@
     <target name="falcon-get" depends="falcon-get-check" unless="falcon.downloaded" >
         <mkdir dir="${download.dir}"/>
         <echo>${INFO_INSTALLING_FALCON} ${falcon.url.path}/${falcon.url.file}</echo>
+        <property name="do-not-cache-next-get" value="true" />
         <get src="${falcon.url.path}/${falcon.url.file}"
         dest="${download.dir}/${falcon.url.file}"
         verbose="false"/>


[2/7] more legacy classes need to make mustella happy. Some are stripped down to eliminate undesirable dependencies

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectUtil.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectUtil.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectUtil.as
new file mode 100644
index 0000000..bdf69ab
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/ObjectUtil.as
@@ -0,0 +1,1424 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.utils
+{
+
+import flash.utils.ByteArray;
+import flash.utils.Dictionary;
+import flash.utils.getQualifiedClassName;
+import flash.xml.XMLNode;
+
+/**
+ *  The ObjectUtil class is an all-static class with methods for
+ *  working with Objects within Flex.
+ *  You do not create instances of ObjectUtil;
+ *  instead you simply call static methods such as the 
+ *  <code>ObjectUtil.isSimple()</code> method.
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+public class ObjectUtil
+{
+    
+    /**
+    *  Array of properties to exclude from debugging output.
+    *  
+    *  @langversion 3.0
+    *  @playerversion Flash 9
+    *  @playerversion AIR 1.1
+    *  @productversion Flex 3
+    */
+    private static var defaultToStringExcludes:Array = ["password", "credentials"];
+
+    //--------------------------------------------------------------------------
+    //
+    //  Class methods
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  Compares the Objects and returns an integer value 
+     *  indicating if the first item is less than greater than or equal to
+     *  the second item.
+     *  This method will recursively compare properties on nested objects and
+     *  will return as soon as a non-zero result is found.
+     *  By default this method will recurse to the deepest level of any property.
+     *  To change the depth for comparison specify a non-negative value for
+     *  the <code>depth</code> parameter.
+     *
+     *  @param a Object.
+     *
+     *  @param b Object.
+     *
+     *  @param depth Indicates how many levels should be 
+     *  recursed when performing the comparison.
+     *  Set this value to 0 for a shallow comparison of only the primitive 
+     *  representation of each property.
+     *  For example:<pre>
+     *  var a:Object = {name:"Bob", info:[1,2,3]};
+     *  var b:Object = {name:"Alice", info:[5,6,7]};
+     *  var c:int = ObjectUtil.compare(a, b, 0);</pre>
+     *
+     *  <p>In the above example the complex properties of <code>a</code> and 
+     *  <code>b</code> will be flattened by a call to <code>toString()</code>
+     *  when doing the comparison.
+     *  In this case the <code>info</code> property will be turned into a string
+     *  when performing the comparison.</p>
+     *
+     *  @return Return 0 if a and b are null, NaN, or equal. 
+     *  Return 1 if a is null or greater than b. 
+     *  Return -1 if b is null or greater than a. 
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function compare(a:Object, b:Object, depth:int = -1):int
+    {
+        return internalCompare(a, b, 0, depth, new Dictionary(true));
+    }
+    
+    /**
+     *  Copies the specified Object and returns a reference to the copy.
+     *  The copy is made using a native serialization technique. 
+     *  This means that custom serialization will be respected during the copy.
+     *
+     *  <p>This method is designed for copying data objects, 
+     *  such as elements of a collection. It is not intended for copying 
+     *  a UIComponent object, such as a TextInput control. If you want to create copies 
+     *  of specific UIComponent objects, you can create a subclass of the component and implement 
+     *  a <code>clone()</code> method, or other method to perform the copy.</p>
+     * 
+     *  @param value Object that should be copied.
+     * 
+     *  @return Copy of the specified Object.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */ 
+    public static function copy(value:Object):Object
+    {
+        var buffer:ByteArray = new ByteArray();
+        buffer.writeObject(value);
+        buffer.position = 0;
+        var result:Object = buffer.readObject();
+        return result;
+    }
+
+    /**
+     *  Clones the specified Object and returns a reference to the clone.
+     *  The clone is made using a native serialization technique. 
+     *  This means that custom serialization will be respected during the
+     *  cloning.  clone() differs from copy() in that the uid property of
+     *  each object instance is retained.
+     *
+     *  <p>This method is designed for cloning data objects, 
+     *  such as elements of a collection. It is not intended for cloning 
+     *  a UIComponent object, such as a TextInput control. If you want to clone
+     *  specific UIComponent objects, you can create a subclass of the component
+     *  and implement a <code>clone()</code> method.</p>
+     * 
+     *  @param value Object that should be cloned.
+     * 
+     *  @return Clone of the specified Object.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 4
+     */ 
+    public static function clone(value:Object):Object
+    {
+        var result:Object = copy(value);
+        cloneInternal(result, value);
+        return result;
+    }
+
+    /**
+     *  Recursive helper used by the public clone method. 
+     *  @private
+     */    
+    private static function cloneInternal(result:Object, value:Object):void
+    {
+        if (value && value.hasOwnProperty("uid"))
+            result.uid = value.uid;
+
+        var classInfo:Object = getClassInfo(value);
+        var v:Object;
+        for each (var p:* in classInfo.properties) 
+        {
+            v = value[p];
+            if (v && v.hasOwnProperty("uid")) 
+                cloneInternal(result[p], v);
+        }
+    }
+   
+    /**
+     *  Returns <code>true</code> if the object reference specified
+     *  is a simple data type. The simple data types include the following:
+     *  <ul>
+     *    <li><code>String</code></li>
+     *    <li><code>Number</code></li>
+     *    <li><code>uint</code></li>
+     *    <li><code>int</code></li>
+     *    <li><code>Boolean</code></li>
+     *    <li><code>Date</code></li>
+     *    <li><code>Array</code></li>
+     *  </ul>
+     *
+     *  @param value Object inspected.
+     *
+     *  @return <code>true</code> if the object specified
+     *  is one of the types above; <code>false</code> otherwise.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function isSimple(value:Object):Boolean
+    {
+        var type:String = typeof(value);
+        switch (type)
+        {
+            case "number":
+            case "string":
+            case "boolean":
+            {
+                return true;
+            }
+
+            case "object":
+            {
+                return (value is Date) || (value is Array);
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     *  Compares two numeric values.
+     * 
+     *  @param a First number.
+     * 
+     *  @param b Second number.
+     *
+     *  @return 0 is both numbers are NaN. 
+     *  1 if only <code>a</code> is a NaN.
+     *  -1 if only <code>b</code> is a NaN.
+     *  -1 if <code>a</code> is less than <code>b</code>.
+     *  1 if <code>a</code> is greater than <code>b</code>.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function numericCompare(a:Number, b:Number):int
+    {
+        if (isNaN(a) && isNaN(b))
+            return 0;
+
+        if (isNaN(a))
+            return 1;
+
+        if (isNaN(b))
+           return -1;
+
+        if (a < b)
+            return -1;
+
+        if (a > b)
+            return 1;
+
+        return 0;
+    }
+
+    /**
+     *  Compares two String values.
+     * 
+     *  @param a First String value.
+     * 
+     *  @param b Second String value.
+     *
+     *  @param caseInsensitive Specifies to perform a case insensitive compare, 
+     *  <code>true</code>, or not, <code>false</code>.
+     *
+     *  @return 0 is both Strings are null. 
+     *  1 if only <code>a</code> is null.
+     *  -1 if only <code>b</code> is null.
+     *  -1 if <code>a</code> precedes <code>b</code>.
+     *  1 if <code>b</code> precedes <code>a</code>.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function stringCompare(a:String, b:String,
+                                         caseInsensitive:Boolean = false):int
+    {
+        if (a == null && b == null)
+            return 0;
+
+        if (a == null)
+          return 1;
+
+        if (b == null)
+           return -1;
+
+        // Convert to lowercase if we are case insensitive.
+        if (caseInsensitive)
+        {
+            a = a.toLocaleLowerCase();
+            b = b.toLocaleLowerCase();
+        }
+
+        var result:int = a.localeCompare(b);
+        
+        if (result < -1)
+            result = -1;
+        else if (result > 1)
+            result = 1;
+
+        return result;
+    }
+
+    /**
+     *  Compares the two Date objects and returns an integer value 
+     *  indicating if the first Date object is before, equal to, 
+     *  or after the second item.
+     *
+     *  @param a Date object.
+     *
+     *  @param b Date object.
+     *
+     *  @return 0 if <code>a</code> and <code>b</code> are equal
+     *  (or both are <code>null</code>);
+     *  -1 if <code>a</code> is before <code>b</code>
+     *  (or <code>b</code> is <code>null</code>);
+     *  1 if <code>a</code> is after <code>b</code>
+     *  (or <code>a</code> is <code>null</code>);
+	 *  0 is both dates getTime's are NaN;
+     *  1 if only <code>a</code> getTime is a NaN;
+     *  -1 if only <code>b</code> getTime is a NaN.    
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function dateCompare(a:Date, b:Date):int
+    {
+        if (a == null && b == null)
+            return 0;
+
+        if (a == null)
+          return 1;
+
+        if (b == null)
+           return -1;
+
+        var na:Number = a.getTime();
+        var nb:Number = b.getTime();
+        
+        if (na < nb)
+            return -1;
+
+        if (na > nb)
+            return 1;
+		
+		if (isNaN(na) && isNaN(nb))
+			return 0;
+		
+		if (isNaN(na))
+			return 1;
+		
+		if (isNaN(nb))
+			return -1;
+
+        return 0;
+    }
+        
+    /**
+     *  Pretty-prints the specified Object into a String.
+     *  All properties will be in alpha ordering.
+     *  Each object will be assigned an id during printing;
+     *  this value will be displayed next to the object type token
+     *  preceded by a '#', for example:
+     *
+     *  <pre>
+     *  (mx.messaging.messages::AsyncMessage)#2.</pre>
+     *
+     *  <p>This id is used to indicate when a circular reference occurs.
+     *  Properties of an object that are of the <code>Class</code> type will
+     *  appear only as the assigned type.
+     *  For example a custom definition like the following:</p>
+     *
+     *  <pre>
+     *    public class MyCustomClass {
+     *      public var clazz:Class;
+     *    }</pre>
+     * 
+     *  <p>With the <code>clazz</code> property assigned to <code>Date</code>
+     *  will display as shown below:</p>
+     * 
+     *  <pre>
+     *   (somepackage::MyCustomClass)#0
+     *      clazz = (Date)</pre>
+     *
+     *  @param obj Object to be pretty printed.
+     * 
+     *  @param namespaceURIs Array of namespace URIs for properties 
+     *  that should be included in the output.
+     *  By default only properties in the public namespace will be included in
+     *  the output.
+     *  To get all properties regardless of namespace pass an array with a 
+     *  single element of "*".
+     * 
+     *  @param exclude Array of the property names that should be 
+     *  excluded from the output.
+     *  Use this to remove data from the formatted string.
+     * 
+     *  @return String containing the formatted version
+     *  of the specified object.
+     *
+     *  @example
+     *  <pre>
+     *  // example 1
+     *  var obj:AsyncMessage = new AsyncMessage();
+     *  obj.body = [];
+     *  obj.body.push(new AsyncMessage());
+     *  obj.headers["1"] = { name: "myName", num: 15.3};
+     *  obj.headers["2"] = { name: "myName", num: 15.3};
+     *  obj.headers["10"] = { name: "myName", num: 15.3};
+     *  obj.headers["11"] = { name: "myName", num: 15.3};
+     *  trace(ObjectUtil.toString(obj));
+     *
+     *  // will output to flashlog.txt
+     *  (mx.messaging.messages::AsyncMessage)#0
+     *    body = (Array)#1
+     *      [0] (mx.messaging.messages::AsyncMessage)#2
+     *        body = (Object)#3
+     *        clientId = (Null)
+     *        correlationId = ""
+     *        destination = ""
+     *        headers = (Object)#4
+     *        messageId = "378CE96A-68DB-BC1B-BCF7FFFFFFFFB525"
+     *        sequenceId = (Null)
+     *        sequencePosition = 0
+     *        sequenceSize = 0
+     *        timeToLive = 0
+     *        timestamp = 0
+     *    clientId = (Null)
+     *    correlationId = ""
+     *    destination = ""
+     *    headers = (Object)#5
+     *      1 = (Object)#6
+     *        name = "myName"
+     *        num = 15.3
+     *      10 = (Object)#7
+     *        name = "myName"
+     *        num = 15.3
+     *      11 = (Object)#8
+     *        name = "myName"
+     *        num = 15.3
+     *      2 = (Object)#9
+     *        name = "myName"
+     *        num = 15.3
+     *    messageId = "1D3E6E96-AC2D-BD11-6A39FFFFFFFF517E"
+     *    sequenceId = (Null)
+     *    sequencePosition = 0
+     *    sequenceSize = 0
+     *    timeToLive = 0
+     *    timestamp = 0
+     *
+     *  // example 2 with circular references
+     *  obj = {};
+     *  obj.prop1 = new Date();
+     *  obj.prop2 = [];
+     *  obj.prop2.push(15.2);
+     *  obj.prop2.push("testing");
+     *  obj.prop2.push(true);
+     *  obj.prop3 = {};
+     *  obj.prop3.circular = obj;
+     *  obj.prop3.deeper = new ErrorMessage();
+     *  obj.prop3.deeper.rootCause = obj.prop3.deeper;
+     *  obj.prop3.deeper2 = {};
+     *  obj.prop3.deeper2.deeperStill = {};
+     *  obj.prop3.deeper2.deeperStill.yetDeeper = obj;
+     *  trace(ObjectUtil.toString(obj));
+     *
+     *  // will output to flashlog.txt
+     *  (Object)#0
+     *    prop1 = Tue Apr 26 13:59:17 GMT-0700 2005
+     *    prop2 = (Array)#1
+     *      [0] 15.2
+     *      [1] "testing"
+     *      [2] true
+     *    prop3 = (Object)#2
+     *      circular = (Object)#0
+     *      deeper = (mx.messaging.messages::ErrorMessage)#3
+     *        body = (Object)#4
+     *        clientId = (Null)
+     *        code = (Null)
+     *        correlationId = ""
+     *        destination = ""
+     *        details = (Null)
+     *        headers = (Object)#5
+     *        level = (Null)
+     *        message = (Null)
+     *        messageId = "14039376-2BBA-0D0E-22A3FFFFFFFF140A"
+     *        rootCause = (mx.messaging.messages::ErrorMessage)#3
+     *        sequenceId = (Null)
+     *        sequencePosition = 0
+     *        sequenceSize = 0
+     *        timeToLive = 0
+     *        timestamp = 0
+     *      deeper2 = (Object)#6
+     *        deeperStill = (Object)#7
+     *          yetDeeper = (Object)#0
+     * 
+     * // example 3 with Dictionary
+     * var point:Point = new Point(100, 100);
+     * var point2:Point = new Point(100, 100);
+     * var obj:Dictionary = new Dictionary();
+     * obj[point] = "point";
+     * obj[point2] = "point2";
+     * obj["1"] = { name: "one", num: 1};
+     * obj["two"] = { name: "2", num: 2};
+     * obj[3] = 3;
+     * trace(ObjectUtil.toString(obj));
+     * 
+     * // will output to flashlog.txt
+     * (flash.utils::Dictionary)#0
+     *   {(flash.geom::Point)#1
+     *     length = 141.4213562373095
+     *     x = 100
+     *     y = 100} = "point2"
+     *   {(flash.geom::Point)#2
+     *     length = 141.4213562373095
+     *     x = 100
+     *     y = 100} = "point"
+     *   {1} = (Object)#3
+     *     name = "one"
+     *     num = 1
+     *   {3} = 3
+     *   {"two"} = (Object)#4
+     *     name = "2"
+     *     num = 2
+     * 
+     * </pre>
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function toString(value:Object, 
+                                    namespaceURIs:Array = null, 
+                                    exclude:Array = null):String
+    {
+        if (exclude == null)
+        {
+            exclude = defaultToStringExcludes;
+        }
+        
+        refCount = 0;
+        return internalToString(value, 0, null, namespaceURIs, exclude);
+    }
+    
+    /**
+     *  This method cleans up all of the additional parameters that show up in AsDoc
+     *  code hinting tools that developers shouldn't ever see.
+     *  @private
+     */
+    private static function internalToString(value:Object, 
+                                             indent:int = 0,
+                                             refs:Dictionary= null, 
+                                             namespaceURIs:Array = null, 
+                                             exclude:Array = null):String
+    {
+        var str:String;
+        var type:String = value == null ? "null" : typeof(value);
+        switch (type)
+        {
+            case "boolean":
+            case "number":
+            {
+                return value.toString();
+            }
+
+            case "string":
+            {
+                return "\"" + value.toString() + "\"";
+            }
+
+            case "object":
+            {
+                if (value is Date)
+                {
+                    return value.toString();
+                }
+                else if (value is XMLNode)
+                {
+                    return value.toString();
+                }
+                else if (value is Class)
+                {
+                    return "(" + getQualifiedClassName(value) + ")";
+                }
+                else
+                {
+                    var classInfo:Object = getClassInfo(value, exclude,
+                        { includeReadOnly: true, uris: namespaceURIs });
+                        
+                    var properties:Array = classInfo.properties;
+                    
+                    str = "(" + classInfo.name + ")";
+                    
+                    // refs help us avoid circular reference infinite recursion.
+                    // Each time an object is encoumtered it is pushed onto the
+                    // refs stack so that we can determine if we have visited
+                    // this object already.
+                    if (refs == null)
+                        refs = new Dictionary(true);
+
+                    // Check to be sure we haven't processed this object before
+                    // Dictionary has some bugs, so we want to work around them as best we can
+                    try
+                    {
+                        var id:Object = refs[value];
+                        if (id != null)
+                        {
+                            str += "#" + int(id);
+                            return str;
+                        }
+                    }
+                    catch (e:Error)
+                    {
+                        //Since we can't test for infinite loop, we simply return toString.
+                        return String(value);
+                    }
+                    
+                    if (value != null)
+                    {
+                        str += "#" + refCount.toString();
+                        refs[value] = refCount;
+                        refCount++;
+                    }
+
+                    var isArray:Boolean = value is Array;
+                    var isDict:Boolean = value is Dictionary;
+                    var prop:*;
+                    indent += 2;
+                    
+                    // Print all of the variable values.
+                    for (var j:int = 0; j < properties.length; j++)
+                    {
+                        str = newline(str, indent);
+                        prop = properties[j];
+                        
+                        if (isArray)
+                            str += "[";
+                        else if (isDict)
+                            str += "{";
+
+                    
+                        if (isDict)
+                        {
+                            // in dictionaries, recurse on the key, because it can be a complex object
+                            str += internalToString(prop, indent, refs,
+                                                    namespaceURIs, exclude);
+                        }
+                        else
+                        {
+                            str += prop.toString();
+                        }
+                        
+                        if (isArray)
+                            str += "] ";
+                        else if (isDict)
+                            str += "} = ";
+                        else
+                            str += " = ";
+                        
+                        try
+                        {
+                            // print the value
+                            str += internalToString(value[prop], indent, refs,
+                                                    namespaceURIs, exclude);
+                        }
+                        catch(e:Error)
+                        {
+                            // value[prop] can cause an RTE
+                            // for certain properties of certain objects.
+                            // For example, accessing the properties
+                            //   actionScriptVersion
+                            //   childAllowsParent
+                            //   frameRate
+                            //   height
+                            //   loader
+                            //   parentAllowsChild
+                            //   sameDomain
+                            //   swfVersion
+                            //   width
+                            // of a Stage's loaderInfo causes
+                            //   Error #2099: The loading object is not
+                            //   sufficiently loaded to provide this information
+                            // In this case, we simply output ? for the value.
+                            str += "?";
+                        }
+                    }
+                    indent -= 2;
+                    return str;
+                }
+                break;
+            }
+
+            case "xml":
+            {
+                return value.toXMLString();
+            }
+
+            default:
+            {
+                return "(" + type + ")";
+            }
+        }
+        
+        return "(unknown)";
+    }
+
+    /**
+     *  @private
+     *  This method will append a newline and the specified number of spaces
+     *  to the given string.
+     */
+    private static function newline(str:String, n:int = 0):String
+    {
+        var result:String = str;
+        result += "\n";
+        
+        for (var i:int = 0; i < n; i++)
+        {
+            result += " ";
+        }
+        return result;
+    }
+    
+    private static function internalCompare(a:Object, b:Object,
+                                            currentDepth:int, desiredDepth:int,
+                                            refs:Dictionary):int
+    {
+        if (a == null && b == null)
+            return 0;
+    
+        if (a == null)
+            return 1;
+    
+        if (b == null)
+            return -1;
+           
+        if (a is ObjectProxy)
+            a = ObjectProxy(a).object_proxy::object;
+            
+        if (b is ObjectProxy)
+            b = ObjectProxy(b).object_proxy::object;
+            
+        var typeOfA:String = typeof(a);
+        var typeOfB:String = typeof(b);
+        
+        var result:int = 0;
+        
+        if (typeOfA == typeOfB)
+        {
+            switch(typeOfA)
+            {
+                case "boolean":
+                {
+                    result = numericCompare(Number(a), Number(b));
+                    break;
+                }
+                
+                case "number":
+                {
+                    result = numericCompare(a as Number, b as Number);
+                    break;
+                }
+                
+                case "string":
+                {
+                    result = stringCompare(a as String, b as String);
+                    break;
+                }
+                
+                case "object":
+                {
+                    var newDepth:int = desiredDepth > 0 ? desiredDepth -1 : desiredDepth;
+                    
+                    // refs help us avoid circular reference infinite recursion.
+                    var aRef:Object = getRef(a,refs);
+                    var bRef:Object = getRef(b,refs);
+                    
+                    if (aRef == bRef)
+                        return 0;
+                    // the cool thing about our dictionary is that if 
+                    // we've seen objects and determined that they are inequal, then 
+                    // we would've already exited out of this compare() call.  So the 
+                    // only info in the dictionary are sets of equal items
+                    
+                    // let's first define them as equal
+                    // this stops an "infinite loop" problem where A.i = B and B.i = A
+                    // if we later find that an object (one of the subobjects) is in fact unequal, 
+                    // then we will return false and quit out of everything.  These refs are thrown away
+                    // so it doesn't matter if it's correct.
+                    refs[bRef] = aRef;
+                    
+                    if (desiredDepth != -1 && (currentDepth > desiredDepth))
+                    {
+                        // once we try to go beyond the desired depth we should 
+                        // toString() our way out
+                        result = stringCompare(a.toString(), b.toString());
+                    }
+                    else if ((a is Array) && (b is Array))
+                    {
+                        result = arrayCompare(a as Array, b as Array, currentDepth, desiredDepth, refs);
+                    }
+                    else if ((a is Date) && (b is Date))
+                    {
+                        result = dateCompare(a as Date, b as Date);
+                    }
+                    else if ((a is ByteArray) && (b is ByteArray))
+                    {
+                        result = byteArrayCompare(a as ByteArray, b as ByteArray);
+                    }
+                    else if (getQualifiedClassName(a) == getQualifiedClassName(b))
+                    {
+                        var aProps:Array = getClassInfo(a).properties;
+                        var bProps:Array;
+                        
+                        // if the objects are dynamic they could have different 
+                        // # of properties and should be treated on that basis first
+                        var isDynamicObject:Boolean = isDynamicObject(a);
+                        
+                        // if it's dynamic, check to see that they have all the same properties
+                        if (isDynamicObject)
+                        {
+                            bProps = getClassInfo(b).properties;
+                            result = arrayCompare(aProps, bProps, currentDepth, newDepth, refs);
+                            if (result != 0)
+                                return result;
+                        }
+                        
+                        // now that we know we have the same properties, let's compare the values
+                        var propName:QName;
+                        var aProp:Object;
+                        var bProp:Object;
+                        for (var i:int = 0; i < aProps.length; i++)
+                        {
+                            propName = aProps[i];
+                            aProp = a[propName];
+                            bProp = b[propName];
+                            result = internalCompare(aProp, bProp, currentDepth+1, newDepth, refs);
+                            if (result != 0)
+                            {
+                                return result;
+                            }
+                        }
+                    }
+                    else
+                    {
+                        // We must be inequal, so return 1
+                        return 1;
+                    }
+                    break;
+                }
+            }
+        }
+        else // be consistent with the order we return here
+        {
+            return stringCompare(typeOfA, typeOfB);
+        }
+
+        return result;
+    }
+    
+    /**
+     *  Returns information about the class, and properties of the class, for
+     *  the specified Object.
+     *
+     *  @param obj The Object to inspect.
+     *
+     *  @param exclude Array of Strings specifying the property names that should be 
+     *  excluded from the returned result. For example, you could specify 
+     *  <code>["currentTarget", "target"]</code> for an Event object since these properties 
+     *  can cause the returned result to become large.
+     *
+     *  @param options An Object containing one or more properties 
+     *  that control the information returned by this method. 
+     *  The properties include the following:
+     *
+     *  <ul>
+     *    <li><code>includeReadOnly</code>: If <code>false</code>, 
+     *      exclude Object properties that are read-only. 
+     *      The default value is <code>true</code>.</li>
+     *  <li><code>includeTransient</code>: If <code>false</code>, 
+     *      exclude Object properties and variables that have <code>[Transient]</code> metadata.
+     *      The default value is <code>true</code>.</li>
+     *  <li><code>uris</code>: Array of Strings of all namespaces that should be included in the output.
+     *      It does allow for a wildcard of "~~". 
+     *      By default, it is null, meaning no namespaces should be included. 
+     *      For example, you could specify <code>["mx_internal", "mx_object"]</code> 
+     *      or <code>["~~"]</code>.</li>
+     *  </ul>
+     * 
+     *  @return An Object containing the following properties:
+     *  <ul>
+     *    <li><code>name</code>: String containing the name of the class.</li>
+     *    <li><code>properties</code>: Sorted list of the property names of the specified object,
+     *    or references to the original key if the specified object is a Dictionary. The individual
+     *    array elements are QName instances, which contain both the local name of the property as well as the URI.</li>
+     *  </ul>
+    *  
+    *  @langversion 3.0
+    *  @playerversion Flash 9
+    *  @playerversion AIR 1.1
+    *  @productversion Flex 3
+    */
+    public static function getClassInfo(obj:Object,
+                                        excludes:Array = null,
+                                        options:Object = null):Object
+    {   
+        var n:int;
+        var i:int;
+
+        if (obj is ObjectProxy)
+            obj = ObjectProxy(obj).object_proxy::object;
+
+        if (options == null)
+            options = { includeReadOnly: true, uris: null, includeTransient: true };
+
+        var result:Object;
+        var propertyNames:Array = [];
+        var cacheKey:String;
+
+        var className:String;
+        var classAlias:String;
+        var properties:XMLList;
+        var prop:XML;
+        var dynamic:Boolean = false;
+        var metadataInfo:Object;
+
+        if (typeof(obj) == "xml")
+        {
+            className = "XML";
+            properties = obj.text();
+            if (properties.length())
+                propertyNames.push("*");
+            properties = obj.attributes();
+        }
+        else
+        {
+            var classInfo:XML = DescribeTypeCache.describeType(obj).typeDescription;
+            className = classInfo.@name.toString();
+            classAlias = classInfo.@alias.toString();
+            dynamic = (classInfo.@isDynamic.toString() == "true");
+
+            if (options.includeReadOnly)
+                properties = classInfo..accessor.(@access != "writeonly") + classInfo..variable;
+            else
+                properties = classInfo..accessor.(@access == "readwrite") + classInfo..variable;
+
+            var numericIndex:Boolean = false;
+        }
+
+        // If type is not dynamic, check our cache for class info...
+        if (!dynamic)
+        {
+            cacheKey = getCacheKey(obj, excludes, options);
+            result = CLASS_INFO_CACHE[cacheKey];
+            if (result != null)
+                return result;
+        }
+
+        result = {};
+        result["name"] = className;
+        result["alias"] = classAlias;
+        result["properties"] = propertyNames;
+        result["dynamic"] = dynamic;
+        result["metadata"] = metadataInfo = recordMetadata(properties);
+        
+        var excludeObject:Object = {};
+        if (excludes)
+        {
+            n = excludes.length;
+            for (i = 0; i < n; i++)
+            {
+                excludeObject[excludes[i]] = 1;
+            }
+        }
+
+        var isArray:Boolean = (obj is Array);
+        var isDict:Boolean  = (obj is Dictionary);
+        
+        if (isDict)
+        {
+            // dictionaries can have multiple keys of the same type,
+            // (they can index by reference rather than QName, String, or number),
+            // which cannot be looked up by QName, so use references to the actual key
+            for (var key:* in obj)
+            {
+                propertyNames.push(key);
+            }
+        }
+        else if (dynamic)
+        {
+            for (var p:String in obj)
+            {
+                if (excludeObject[p] != 1)
+                {
+                    if (isArray)
+                    {
+                         var pi:Number = parseInt(p);
+                         if (isNaN(pi))
+                            propertyNames.push(new QName("", p));
+                         else
+                            propertyNames.push(pi);
+                    }
+                    else
+                    {
+                        propertyNames.push(new QName("", p));
+                    }
+                }
+            }
+            numericIndex = isArray && !isNaN(Number(p));
+        }
+
+        if (isArray || isDict || className == "Object")
+        {
+            // Do nothing since we've already got the dynamic members
+        }
+        else if (className == "XML")
+        {
+            n = properties.length();
+            for (i = 0; i < n; i++)
+            {
+                p = properties[i].name();
+                if (excludeObject[p] != 1)
+                    propertyNames.push(new QName("", "@" + p));
+            }
+        }
+        else
+        {
+            n = properties.length();
+            var uris:Array = options.uris;
+            var uri:String;
+            var qName:QName;
+            for (i = 0; i < n; i++)
+            {
+                prop = properties[i];
+                p = prop.@name.toString();
+                uri = prop.@uri.toString();
+                
+                if (excludeObject[p] == 1)
+                    continue;
+                    
+                if (!options.includeTransient && internalHasMetadata(metadataInfo, p, "Transient"))
+                    continue;
+                
+                if (uris != null)
+                {
+                    if (uris.length == 1 && uris[0] == "*")
+                    {   
+                        qName = new QName(uri, p);
+                        try
+                        {
+                            obj[qName]; // access the property to ensure it is supported
+                            propertyNames.push();
+                        }
+                        catch(e:Error)
+                        {
+                            // don't keep property name 
+                        }
+                    }
+                    else
+                    {
+                        for (var j:int = 0; j < uris.length; j++)
+                        {
+                            uri = uris[j];
+                            if (prop.@uri.toString() == uri)
+                            {
+                                qName = new QName(uri, p);
+                                try
+                                {
+                                    obj[qName];
+                                    propertyNames.push(qName);
+                                }
+                                catch(e:Error)
+                                {
+                                    // don't keep property name 
+                                }
+                            }
+                        }
+                    }
+                }
+                else if (uri.length == 0)
+                {
+                    qName = new QName(uri, p);
+                    try
+                    {
+                        obj[qName];
+                        propertyNames.push(qName);
+                    }
+                    catch(e:Error)
+                    {
+                        // don't keep property name 
+                    }
+                }
+            }
+        }
+
+        propertyNames.sort(Array.CASEINSENSITIVE |
+                           (numericIndex ? Array.NUMERIC : 0));
+
+        // dictionary keys can be indexed by an object reference
+        // there's a possibility that two keys will have the same toString()
+        // so we don't want to remove dupes
+        if (!isDict)
+        {
+            // for Arrays, etc., on the other hand...
+            // remove any duplicates, i.e. any items that can't be distingushed by toString()
+            for (i = 0; i < propertyNames.length - 1; i++)
+            {
+                // the list is sorted so any duplicates should be adjacent
+                // two properties are only equal if both the uri and local name are identical
+                if (propertyNames[i].toString() == propertyNames[i + 1].toString())
+                {
+                    propertyNames.splice(i, 1);
+                    i--; // back up
+                }
+            }
+        }
+
+        // For normal, non-dynamic classes we cache the class info
+		// Don't cache XML as it can be dynamic
+        if (!dynamic && className != "XML")
+        {
+            cacheKey = getCacheKey(obj, excludes, options);
+            CLASS_INFO_CACHE[cacheKey] = result;
+        }
+
+        return result;
+    }
+
+    /**
+     * Uses <code>getClassInfo</code> and examines the metadata information to
+     * determine whether a property on a given object has the specified 
+     * metadata.
+     * 
+     * @param obj The object holding the property.
+     * @param propName The property to check for metadata.
+     * @param metadataName The name of the metadata to check on the property.
+     * @param excludes If any properties need to be excluded when generating class info. (Optional)
+     * @param options If any options flags need to changed when generating class info. (Optional)
+     * @return true if the property has the specified metadata.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function hasMetadata(obj:Object, 
+                propName:String, 
+                metadataName:String, 
+                excludes:Array = null,
+                options:Object = null):Boolean
+    {
+        var classInfo:Object = getClassInfo(obj, excludes, options);
+        var metadataInfo:Object = classInfo["metadata"];
+        return internalHasMetadata(metadataInfo, propName, metadataName);
+    }
+
+    /**
+     *  Returns <code>true</code> if the object is an instance of a dynamic class.
+     *
+     *  @param obj The object.
+     *
+     *  @return <code>true</code> if the object is an instance of a dynamic class.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function isDynamicObject(obj:Object):Boolean
+    {
+        try
+        {
+            // this test for checking whether an object is dynamic or not is 
+            // pretty hacky, but it assumes that no-one actually has a 
+            // property defined called "wootHackwoot"
+            obj["wootHackwoot"];
+        }
+        catch (e:Error)
+        {
+            // our object isn't from a dynamic class
+            return false;
+        }
+        return true;
+    }
+    
+    /**
+     *  @private
+     */
+    private static function internalHasMetadata(metadataInfo:Object, propName:String, metadataName:String):Boolean
+    {
+        if (metadataInfo != null)
+        {
+            var metadata:Object = metadataInfo[propName];
+            if (metadata != null)
+            {
+                if (metadata[metadataName] != null)
+                    return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     *  @private
+     */
+    private static function recordMetadata(properties:XMLList):Object
+    {
+        var result:Object = null;
+
+        try
+        {
+            for each (var prop:XML in properties)
+            {
+                var propName:String = prop.attribute("name").toString();
+                var metadataList:XMLList = prop.metadata;
+
+                if (metadataList.length() > 0)
+                {
+                    if (result == null)
+                        result = {};
+
+                    var metadata:Object = {};
+                    result[propName] = metadata;
+
+                    for each (var md:XML in metadataList)
+                    {
+                        var mdName:String = md.attribute("name").toString();
+                        
+                        var argsList:XMLList = md.arg;
+                        var value:Object = {};
+
+                        for each (var arg:XML in argsList)
+                        {
+                            var argKey:String = arg.attribute("key").toString();
+                            if (argKey != null)
+                            {
+                                var argValue:String = arg.attribute("value").toString();
+                                value[argKey] = argValue;
+                            }
+                        }
+
+                        var existing:Object = metadata[mdName];
+                        if (existing != null)
+                        {
+                            var existingArray:Array;
+                            if (existing is Array)
+                                existingArray = existing as Array;
+                            else
+                            {
+                                existingArray = [existing];
+                                delete metadata[mdName];
+                            }
+                            existingArray.push(value);
+                            existing = existingArray;
+                        }
+                        else
+                        {
+                            existing = value;
+                        }
+                        metadata[mdName] = existing;
+                    }
+                }
+            }
+        }
+        catch(e:Error)
+        {
+        }
+        
+        return result;
+    }
+
+
+    /**
+     *  @private
+     */
+    private static function getCacheKey(o:Object, excludes:Array = null, options:Object = null):String
+    {
+        var key:String = getQualifiedClassName(o);
+		
+        if (excludes != null)
+        {
+			var length:int = excludes.length;
+            for (var i:uint = 0; i < length; i++)
+            {
+                var excl:String = excludes[i] as String;
+                if (excl != null)
+                    key += excl;
+            }
+        }
+
+        if (options != null)
+        {
+            for (var flag:String in options)
+            {
+                key += flag;
+				var value:String = options[flag];
+				if (value != null)
+					key += value.toString();
+			}
+        }
+        return key;
+    }
+
+    /**
+     *  @private
+     */
+    private static function arrayCompare(a:Array, b:Array,
+                                         currentDepth:int, desiredDepth:int,
+                                         refs:Dictionary):int
+    {
+        var result:int = 0;
+
+        if (a.length != b.length)
+        {
+            if (a.length < b.length)
+                result = -1;
+            else
+                result = 1;
+        }
+        else
+        {
+            var key:Object;
+            for (key in a)
+            {
+                if (b.hasOwnProperty(key))
+                {
+                    result = internalCompare(a[key], b[key], currentDepth,
+                                         desiredDepth, refs);
+
+                    if (result != 0)
+                        return result;
+                }
+                else
+                {
+                    return -1;
+                }
+            }
+
+            for (key in b)
+            {
+                if (!a.hasOwnProperty(key))
+                {
+                    return 1;
+                }
+            }
+        }
+
+        return result;
+    }
+    
+    /**
+     * @private
+     */
+    private static function byteArrayCompare(a:ByteArray, b:ByteArray):int
+    {
+        var result:int = 0;
+        
+        if (a == b)
+            return result;
+            
+        if (a.length != b.length)
+        {
+            if (a.length < b.length)
+                result = -1;
+            else
+                result = 1;
+        }
+        else
+        {
+            for (var i:int = 0; i < a.length; i++)
+            {
+                result = numericCompare(a[i], b[i]);
+                if (result != 0)
+                {
+                    i = a.length;
+                }
+            }
+        }
+        return result;
+    }
+
+    
+    /**
+     * @private
+     * This is the "find" for our union-find algorithm when doing object searches.
+     * The dictionary keeps track of sets of equal objects
+     */
+    private static function getRef(o:Object, refs:Dictionary):Object
+    {
+        var oRef:Object = refs[o]; 
+        while (oRef && oRef != refs[oRef])
+        {
+            oRef = refs[oRef];
+        }
+        if (!oRef)
+            oRef = o;
+        if (oRef != refs[o])
+            refs[o] = oRef;
+        
+        return oRef
+    }
+    
+    /**
+     * @private
+     */
+    private static var refCount:int = 0;
+
+    /**
+     * @private
+     */ 
+    private static var CLASS_INFO_CACHE:Object = {};
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/StringUtil.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/StringUtil.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/StringUtil.as
new file mode 100644
index 0000000..ee6a6d0
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/StringUtil.as
@@ -0,0 +1,364 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.utils
+{
+
+/**
+ *  The StringUtil utility class is an all-static class with methods for
+ *  working with String objects within Flex.
+ *  You do not create instances of StringUtil;
+ *  instead you call methods such as 
+ *  the <code>StringUtil.substitute()</code> method.  
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+public class StringUtil
+{
+
+    //--------------------------------------------------------------------------
+    //
+    //  Class methods
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  Removes all whitespace characters from the beginning and end
+     *  of the specified string.
+     *
+     *  @param str The String whose whitespace should be trimmed. 
+     *
+     *  @return Updated String where whitespace was removed from the 
+     *  beginning and end. 
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function trim(str:String):String
+    {
+        if (str == null) return '';
+        
+        var startIndex:int = 0;
+        while (isWhitespace(str.charAt(startIndex)))
+            ++startIndex;
+
+        var endIndex:int = str.length - 1;
+        while (isWhitespace(str.charAt(endIndex)))
+            --endIndex;
+
+        if (endIndex >= startIndex)
+            return str.slice(startIndex, endIndex + 1);
+        else
+            return "";
+    }
+    
+    /**
+     *  Removes all whitespace characters from the beginning and end
+     *  of each element in an Array, where the Array is stored as a String. 
+     *
+     *  @param value The String whose whitespace should be trimmed. 
+     *
+     *  @param separator The String that delimits each Array element in the string.
+     *
+     *  @return Updated String where whitespace was removed from the 
+     *  beginning and end of each element. 
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function trimArrayElements(value:String, delimiter:String):String
+    {
+        if (value != "" && value != null)
+        {
+            var items:Array = value.split(delimiter);
+            
+            var len:int = items.length;
+            for (var i:int = 0; i < len; i++)
+            {
+                items[i] = StringUtil.trim(items[i]);
+            }
+            
+            if (len > 0)
+            {
+                value = items.join(delimiter);
+            }
+        }
+        
+        return value;
+    }
+
+    /**
+     *  Returns <code>true</code> if the specified string is
+     *  a single space, tab, carriage return, newline, or formfeed character.
+     *
+     *  @param str The String that is is being queried. 
+     *
+     *  @return <code>true</code> if the specified string is
+     *  a single space, tab, carriage return, newline, or formfeed character.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function isWhitespace(character:String):Boolean
+    {
+        switch (character)
+        {
+            case " ":
+            case "\t":
+            case "\r":
+            case "\n":
+            case "\f":
+			// non breaking space
+			case "\u00A0":
+			// line seperator
+			case "\u2028":
+			// paragraph seperator
+			case "\u2029":
+			// ideographic space
+			case "\u3000":
+                return true;
+
+            default:
+                return false;
+        }
+    }
+
+    /**
+     *  Substitutes "{n}" tokens within the specified string
+     *  with the respective arguments passed in.
+	 * 
+	 *  Note that this uses String.replace and "$" can have special
+	 *  meaning in the argument strings escape by using "$$".
+     *
+     *  @param str The string to make substitutions in.
+     *  This string can contain special tokens of the form
+     *  <code>{n}</code>, where <code>n</code> is a zero based index,
+     *  that will be replaced with the additional parameters
+     *  found at that index if specified.
+     *
+     *  @param rest Additional parameters that can be substituted
+     *  in the <code>str</code> parameter at each <code>{n}</code>
+     *  location, where <code>n</code> is an integer (zero based)
+     *  index value into the array of values specified.
+     *  If the first parameter is an array this array will be used as
+     *  a parameter list.
+     *  This allows reuse of this routine in other methods that want to
+     *  use the ... rest signature.
+     *  For example <pre>
+     *     public function myTracer(str:String, ... rest):void
+     *     { 
+     *         label.text += StringUtil.substitute(str, rest) + "\n";
+     *     } </pre>
+     *
+     *  @return New string with all of the <code>{n}</code> tokens
+     *  replaced with the respective arguments specified.
+     *
+     *  @example
+     *
+     *  var str:String = "here is some info '{0}' and {1}";
+     *  trace(StringUtil.substitute(str, 15.4, true));
+     *
+     *  // this will output the following string:
+     *  // "here is some info '15.4' and true"
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function substitute(str:String, ... rest):String
+    {
+        if (str == null) return '';
+        
+        // Replace all of the parameters in the msg string.
+        var len:uint = rest.length;
+        var args:Array;
+        if (len == 1 && rest[0] is Array)
+        {
+            args = rest[0] as Array;
+            len = args.length;
+        }
+        else
+        {
+            args = rest;
+        }
+        
+        for (var i:int = 0; i < len; i++)
+        {
+            str = str.replace(new RegExp("\\{"+i+"\\}", "g"), args[i]);
+        }
+
+        return str;
+    }
+
+    /**
+     *  Returns a string consisting of a specified string
+     *  concatenated with itself a specified number of times.
+     *
+     *  @param str The string to be repeated.
+     *
+     *  @param n The repeat count.
+     *
+     *  @return The repeated string.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4.1
+     */
+    public static function repeat(str:String, n:int):String
+    {
+        if (n == 0)
+            return "";
+
+        var s:String = str;
+        for (var i:int = 1; i < n; i++)
+        {
+            s += str;
+        }
+        return s;
+    }
+
+    /**
+     *  Removes "unallowed" characters from a string.
+     *  A "restriction string" such as <code>"A-Z0-9"</code>
+     *  is used to specify which characters are allowed.
+     *  This method uses the same logic as the <code>restrict</code>
+     *  property of TextField.
+     *
+     *  @param str The input string.
+     *
+     *  @param restrict The restriction string.
+     *
+     *  @return The input string, minus any characters
+     *  that are not allowed by the restriction string.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4.1
+     */
+    public static function restrict(str:String, restrict:String):String
+    {
+        // A null 'restrict' string means all characters are allowed.
+        if (restrict == null)
+            return str;
+            
+        // An empty 'restrict' string means no characters are allowed.
+        if (restrict == "")
+            return "";
+            
+        // Otherwise, we need to test each character in 'str'
+        // to determine whether the 'restrict' string allows it.
+        var charCodes:Array = [];
+        
+        var n:int = str.length;
+        for (var i:int = 0; i < n; i++)
+        {
+            var charCode:uint = str.charCodeAt(i);
+            if (testCharacter(charCode, restrict))
+                charCodes.push(charCode);
+        }
+        
+        return String.fromCharCode.apply(null, charCodes);
+    }
+                            
+    /**
+     *  @private
+     *  Helper method used by restrict() to test each character
+     *  in the input string against the restriction string.
+     *  The logic in this method implements the same algorithm
+     *  as in TextField's 'restrict' property (which is quirky,
+     *  such as how it handles a '-' at the beginning of the
+     *  restriction string).
+     */
+    private static function testCharacter(charCode:uint,
+                                          restrict:String):Boolean
+    {
+        var allowIt:Boolean = false;
+        
+        var inBackSlash:Boolean = false;
+        var inRange:Boolean = false;
+        var setFlag:Boolean = true;
+        var lastCode:uint = 0;
+                        
+        var n:int = restrict.length;
+        var code:uint;
+        
+        if (n > 0)
+        {
+            code = restrict.charCodeAt(0);
+            if (code == 94) // caret
+                allowIt = true;
+        }
+        
+        for (var i:int = 0; i < n; i++)
+        {
+            code = restrict.charCodeAt(i)
+            
+            var acceptCode:Boolean = false;
+            if (!inBackSlash)
+            {
+                if (code == 45) // hyphen
+                    inRange = true;
+                else if (code == 94) // caret
+                    setFlag = !setFlag;
+                else if (code == 92) // backslash
+                    inBackSlash = true;
+                else
+                    acceptCode = true;
+            }
+            else
+            {
+                acceptCode = true;
+                inBackSlash = false;
+            }
+            
+            if (acceptCode)
+            {
+                if (inRange)
+                {
+                    if (lastCode <= charCode && charCode <= code)
+                        allowIt = setFlag;
+                    inRange = false;
+                    lastCode = 0;
+                }
+                else
+                {
+                    if (charCode == code)
+                        allowIt = setFlag;
+                    lastCode = code;
+                }
+            }
+        }
+        
+        return allowIt;
+    }
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/UIDUtil.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/UIDUtil.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/UIDUtil.as
new file mode 100644
index 0000000..f6cf737
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/UIDUtil.as
@@ -0,0 +1,296 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.utils
+{
+
+import flash.utils.ByteArray;
+import flash.utils.Dictionary;
+
+import mx.core.mx_internal;
+
+use namespace mx_internal;
+
+/**
+ *  The UIDUtil class is an all-static class
+ *  with methods for working with UIDs (unique identifiers) within Flex.
+ *  You do not create instances of UIDUtil;
+ *  instead you simply call static methods such as the
+ *  <code>UIDUtil.createUID()</code> method.
+ * 
+ *  <p><b>Note</b>: If you have a dynamic object that has no [Bindable] properties 
+ *  (which force the object to implement the IUID interface), Flex  adds an 
+ *  <code>mx_internal_uid</code> property that contains a UID to the object. 
+ *  To avoid having this field 
+ *  in your dynamic object, make it [Bindable], implement the IUID interface
+ *  in the object class, or set a <coded>uid</coded> property with a value.</p>
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+public class UIDUtil
+{
+
+    //--------------------------------------------------------------------------
+    //
+    //  Class constants
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  @private
+     *  Char codes for 0123456789ABCDEF
+     */
+	private static const ALPHA_CHAR_CODES:Array = [48, 49, 50, 51, 52, 53, 54, 
+		55, 56, 57, 65, 66, 67, 68, 69, 70];
+
+    private static const DASH:int = 45;       // dash ascii
+    private static const UIDBuffer:ByteArray = new ByteArray();       // static ByteArray used for UID generation to save memory allocation cost
+
+    //--------------------------------------------------------------------------
+    //
+    //  Class variables
+    //
+    //--------------------------------------------------------------------------
+
+    /** 
+     *  This Dictionary records all generated uids for all existing items.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    private static var uidDictionary:Dictionary = new Dictionary(true);
+
+    //--------------------------------------------------------------------------
+    //
+    //  Class methods
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  Generates a UID (unique identifier) based on ActionScript's
+     *  pseudo-random number generator and the current time.
+     *
+     *  <p>The UID has the form
+     *  <code>"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"</code>
+     *  where X is a hexadecimal digit (0-9, A-F).</p>
+     *
+     *  <p>This UID will not be truly globally unique; but it is the best
+     *  we can do without player support for UID generation.</p>
+     *
+     *  @return The newly-generated UID.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+	public static function createUID():String
+    {
+        UIDBuffer.position = 0;
+
+        var i:int;
+        var j:int;
+
+        for (i = 0; i < 8; i++)
+        {
+            UIDBuffer.writeByte(ALPHA_CHAR_CODES[int(Math.random() * 16)]);
+        }
+
+        for (i = 0; i < 3; i++)
+        {
+            UIDBuffer.writeByte(DASH);
+            for (j = 0; j < 4; j++)
+            {
+                UIDBuffer.writeByte(ALPHA_CHAR_CODES[int(Math.random() * 16)]);
+            }
+        }
+
+        UIDBuffer.writeByte(DASH);
+
+        var time:uint = new Date().getTime(); // extract last 8 digits
+        var timeString:String = time.toString(16).toUpperCase();
+        // 0xFFFFFFFF milliseconds ~= 3 days, so timeString may have between 1 and 8 digits, hence we need to pad with 0s to 8 digits
+        for (i = 8; i > timeString.length; i--)
+            UIDBuffer.writeByte(48);
+        UIDBuffer.writeUTFBytes(timeString);
+
+        for (i = 0; i < 4; i++)
+        {
+            UIDBuffer.writeByte(ALPHA_CHAR_CODES[int(Math.random() * 16)]);
+        }
+
+        return UIDBuffer.toString();
+    }
+
+    /**
+     * Converts a 128-bit UID encoded as a ByteArray to a String representation.
+     * The format matches that generated by createUID. If a suitable ByteArray
+     * is not provided, null is returned.
+     * 
+     * @param ba ByteArray 16 bytes in length representing a 128-bit UID.
+     * 
+     * @return String representation of the UID, or null if an invalid
+     * ByteArray is provided.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function fromByteArray(ba:ByteArray):String
+    {
+        if (ba != null && ba.length >= 16 && ba.bytesAvailable >= 16)
+        {
+            UIDBuffer.position = 0;
+            var index:uint = 0;
+            for (var i:uint = 0; i < 16; i++)
+            {
+                if (i == 4 || i == 6 || i == 8 || i == 10)
+                    UIDBuffer.writeByte(DASH); // Hyphen char code
+
+                var b:int = ba.readByte();
+                UIDBuffer.writeByte(ALPHA_CHAR_CODES[(b & 0xF0) >>> 4]);
+                UIDBuffer.writeByte(ALPHA_CHAR_CODES[(b & 0x0F)]);
+            }
+            return UIDBuffer.toString();
+        }
+
+        return null;
+    }
+
+    /**
+     * A utility method to check whether a String value represents a 
+     * correctly formatted UID value. UID values are expected to be 
+     * in the format generated by createUID(), implying that only
+     * capitalized A-F characters in addition to 0-9 digits are
+     * supported.
+     * 
+     * @param uid The value to test whether it is formatted as a UID.
+     * 
+     * @return Returns true if the value is formatted as a UID.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function isUID(uid:String):Boolean
+    {
+        if (uid != null && uid.length == 36)
+        {
+            for (var i:uint = 0; i < 36; i++)
+            {
+                var c:Number = uid.charCodeAt(i);
+
+                // Check for correctly placed hyphens
+                if (i == 8 || i == 13 || i == 18 || i == 23)
+                {
+                    if (c != DASH)
+                    {
+                        return false;
+                    }
+                }
+                // We allow capital alpha-numeric hex digits only
+                else if (c < 48 || c > 70 || (c > 57 && c < 65))
+                {
+                    return false;
+                }
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Converts a UID formatted String to a ByteArray. The UID must be in the
+     * format generated by createUID, otherwise null is returned.
+     * 
+     * @param String representing a 128-bit UID
+     * 
+     * @return ByteArray 16 bytes in length representing the 128-bits of the
+     * UID or null if the uid could not be converted.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function toByteArray(uid:String):ByteArray
+    {
+        if (isUID(uid))
+        {
+            var result:ByteArray = new ByteArray();
+
+            for (var i:uint = 0; i < uid.length; i++)
+            {
+                var c:String = uid.charAt(i);
+                if (c == "-")
+                    continue;
+                var h1:uint = getDigit(c);
+                i++;
+                var h2:uint = getDigit(uid.charAt(i));
+                result.writeByte(((h1 << 4) | h2) & 0xFF);
+            }
+            result.position = 0;
+            return result;
+        }
+
+        return null;
+    }
+
+    /**
+     * Returns the decimal representation of a hex digit.
+     * @private
+     */
+    private static function getDigit(hex:String):uint
+    {
+        switch (hex) 
+        {
+            case "A": 
+            case "a":           
+                return 10;
+            case "B":
+            case "b":
+                return 11;
+            case "C":
+            case "c":
+                return 12;
+            case "D":
+            case "d":
+                return 13;
+            case "E":
+            case "e":
+                return 14;                
+            case "F":
+            case "f":
+                return 15;
+            default:
+                return new uint(hex);
+        }    
+    }
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/dec3558f/frameworks/as/projects/MXMLCClasses/src/mx/utils/object_proxy.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/MXMLCClasses/src/mx/utils/object_proxy.as b/frameworks/as/projects/MXMLCClasses/src/mx/utils/object_proxy.as
new file mode 100644
index 0000000..5aea911
--- /dev/null
+++ b/frameworks/as/projects/MXMLCClasses/src/mx/utils/object_proxy.as
@@ -0,0 +1,34 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.utils
+{
+
+/**
+ *  Documentation is not currently available.
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+public namespace object_proxy =
+	"http://www.adobe.com/2006/actionscript/flash/objectproxy";
+
+}