I'm good with that, but what if the original implementation was
significantly faster on JS but not on AS?  Would you then allow for a
different implementation?

On 11/7/13 11:27 AM, "erikdebr...@apache.org" <erikdebr...@apache.org>
wrote:

>Updated Branches:
>  refs/heads/develop 4b17f61ce -> 9fa2c6f9b
>
>
>An example of how API parity would look. I started at SimpleStateImpl and
>worked my way up ;-)
>
>Also, all these files now comply with the gjslint and JSHint code quality
>requirements.
>
>Signed-off-by: Erik de Bruin <e...@ixsoftware.nl>
>
>
>Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
>Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/9fa2c6f9
>Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/9fa2c6f9
>Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/9fa2c6f9
>
>Branch: refs/heads/develop
>Commit: 9fa2c6f9ba48b7404a873a26ca98658f1aa33e2d
>Parents: 4b17f61
>Author: Erik de Bruin <e...@ixsoftware.nl>
>Authored: Thu Nov 7 20:27:13 2013 +0100
>Committer: Erik de Bruin <e...@ixsoftware.nl>
>Committed: Thu Nov 7 20:27:21 2013 +0100
>
>----------------------------------------------------------------------
> frameworks/js/FlexJS/src/mx/states/AddItems.js  |  35 +++-
> .../js/FlexJS/src/mx/states/SetProperty.js      |  35 +++-
> frameworks/js/FlexJS/src/mx/states/State.js     |   4 +-
> .../src/org/apache/flex/core/IStatesImpl.js     |  38 +++++
> .../FlexJS/src/org/apache/flex/core/IStrand.js  |  55 ++++++
> .../org/apache/flex/core/SimpleStatesImpl.js    | 171 ++++++++++---------
> .../org/apache/flex/events/IEventDispatcher.js  |  25 +++
> 7 files changed, 272 insertions(+), 91 deletions(-)
>----------------------------------------------------------------------
>
>
>http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/9fa2c6f9/frameworks/
>js/FlexJS/src/mx/states/AddItems.js
>----------------------------------------------------------------------
>diff --git a/frameworks/js/FlexJS/src/mx/states/AddItems.js
>b/frameworks/js/FlexJS/src/mx/states/AddItems.js
>index 6b1a347..3cf63a2 100644
>--- a/frameworks/js/FlexJS/src/mx/states/AddItems.js
>+++ b/frameworks/js/FlexJS/src/mx/states/AddItems.js
>@@ -14,10 +14,13 @@
>
> goog.provide('mx.states.AddItems');
>
>+goog.require('org.apache.flex.core.IDocument');
>+
>
>
> /**
>  * @constructor
>+ * @implements {org.apache.flex.core.IDocument}
>  */
> mx.states.AddItems = function() {
> };
>@@ -25,19 +28,15 @@ mx.states.AddItems = function() {
>
> /**
>  * @param {Object} document The MXML object.
>+ * @param {string=} opt_id The id.
>  */
>-mx.states.AddItems.prototype.setDocument = function(document) {
>+mx.states.AddItems.prototype.setDocument = function(document, opt_id) {
>+  opt_id = typeof opt_id !== 'undefined' ? opt_id : null;
>   this.document = document;
> };
>
>
> /**
>- * @type {string} document The type of override.
>- */
>-mx.states.AddItems.prototype.type = 'AddItems';
>-
>-
>-/**
>  * @expose
>  * @type {Object} document The MXML object.
>  */
>@@ -85,3 +84,25 @@ mx.states.AddItems.prototype.position = null;
>  */
> mx.states.AddItems.prototype.relativeTo = null;
>
>+
>+/**
>+ * @expose
>+ * @param {Object} properties The properties for the new object.
>+ * @return {Object} The new object.
>+ */
>+mx.states.AddItems.prototype.initializeFromObject = function(properties)
>{
>+  var p;
>+
>+  for (p in properties) {
>+    this[p] = properties[p];
>+  }
>+
>+  return this;
>+};
>+
>+
>+/**
>+ * @const
>+ */
>+mx.states.AddItems.prototype.FLEXJS_CLASS_INFO =
>+    { interfaces: [org.apache.flex.core.IDocument] };
>
>http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/9fa2c6f9/frameworks/
>js/FlexJS/src/mx/states/SetProperty.js
>----------------------------------------------------------------------
>diff --git a/frameworks/js/FlexJS/src/mx/states/SetProperty.js
>b/frameworks/js/FlexJS/src/mx/states/SetProperty.js
>index 371d986..cfc8b53 100644
>--- a/frameworks/js/FlexJS/src/mx/states/SetProperty.js
>+++ b/frameworks/js/FlexJS/src/mx/states/SetProperty.js
>@@ -14,10 +14,13 @@
>
> goog.provide('mx.states.SetProperty');
>
>+goog.require('org.apache.flex.core.IDocument');
>+
>
>
> /**
>  * @constructor
>+ * @implements {org.apache.flex.core.IDocument}
>  */
> mx.states.SetProperty = function() {
> };
>@@ -25,19 +28,15 @@ mx.states.SetProperty = function() {
>
> /**
>  * @param {Object} document The MXML object.
>+ * @param {string=} opt_id The id.
>  */
>-mx.states.SetProperty.prototype.setDocument = function(document) {
>+mx.states.SetProperty.prototype.setDocument = function(document, opt_id)
>{
>+  opt_id = typeof opt_id !== 'undefined' ? opt_id : null;
>   this.document = document;
> };
>
>
> /**
>- * @type {string} document The type of override.
>- */
>-mx.states.SetProperty.prototype.type = 'SetProperty';
>-
>-
>-/**
>  * @expose
>  * @type {Object} document The MXML object.
>  */
>@@ -71,3 +70,25 @@ mx.states.SetProperty.prototype.previousValue = null;
>  */
> mx.states.SetProperty.prototype.value = null;
>
>+
>+/**
>+ * @expose
>+ * @param {Object} properties The properties for the new object.
>+ * @return {Object} The new object.
>+ */
>+mx.states.SetProperty.prototype.initializeFromObject =
>function(properties) {
>+  var p;
>+
>+  for (p in properties) {
>+    this[p] = properties[p];
>+  }
>+
>+  return this;
>+};
>+
>+
>+/**
>+ * @const
>+ */
>+mx.states.SetProperty.prototype.FLEXJS_CLASS_INFO =
>+    { interfaces: [org.apache.flex.core.IDocument] };
>
>http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/9fa2c6f9/frameworks/
>js/FlexJS/src/mx/states/State.js
>----------------------------------------------------------------------
>diff --git a/frameworks/js/FlexJS/src/mx/states/State.js
>b/frameworks/js/FlexJS/src/mx/states/State.js
>index 29541f9..b325c50 100644
>--- a/frameworks/js/FlexJS/src/mx/states/State.js
>+++ b/frameworks/js/FlexJS/src/mx/states/State.js
>@@ -18,8 +18,10 @@ goog.provide('mx.states.State');
>
> /**
>  * @constructor
>+ * @param {Object=} opt_props The initial properties.
>  */
>-mx.states.State = function() {
>+mx.states.State = function(opt_props) {
>+  opt_props = typeof opt_props !== 'undefined' ? opt_props : null;
> };
>
>
>
>http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/9fa2c6f9/frameworks/
>js/FlexJS/src/org/apache/flex/core/IStatesImpl.js
>----------------------------------------------------------------------
>diff --git a/frameworks/js/FlexJS/src/org/apache/flex/core/IStatesImpl.js
>b/frameworks/js/FlexJS/src/org/apache/flex/core/IStatesImpl.js
>new file mode 100644
>index 0000000..ddb9ebd
>--- /dev/null
>+++ b/frameworks/js/FlexJS/src/org/apache/flex/core/IStatesImpl.js
>@@ -0,0 +1,38 @@
>+/**
>+ * Licensed 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.
>+ */
>+
>+goog.provide('org.apache.flex.core.IStatesImpl');
>+
>+goog.require('org.apache.flex.core.IBead');
>+goog.require('org.apache.flex.events.IEventDispatcher');
>+
>+
>+
>+/**
>+ * IStatesImpl
>+ *
>+ * @interface
>+ * @extends {org.apache.flex.core.IBead}
>+ * @extends {org.apache.flex.events.IEventDispatcher}
>+ */
>+org.apache.flex.core.IStatesImpl = function() {
>+};
>+
>+
>+/**
>+ * @const
>+ */
>+org.apache.flex.core.IStatesImpl.prototype.FLEXJS_CLASS_INFO =
>+    { interfaces: [org.apache.flex.core.IBead,
>+                   org.apache.flex.events.IEventDispatcher] };
>
>http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/9fa2c6f9/frameworks/
>js/FlexJS/src/org/apache/flex/core/IStrand.js
>----------------------------------------------------------------------
>diff --git a/frameworks/js/FlexJS/src/org/apache/flex/core/IStrand.js
>b/frameworks/js/FlexJS/src/org/apache/flex/core/IStrand.js
>new file mode 100644
>index 0000000..8356f12
>--- /dev/null
>+++ b/frameworks/js/FlexJS/src/org/apache/flex/core/IStrand.js
>@@ -0,0 +1,55 @@
>+/**
>+ * Licensed 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.
>+ */
>+
>+goog.provide('org.apache.flex.core.IStrand');
>+
>+
>+
>+/**
>+ * IStrand
>+ *
>+ * @interface
>+ */
>+org.apache.flex.core.IStrand = function() {
>+};
>+
>+
>+/**
>+ * addBead()
>+ *
>+ * @expose
>+ * @param {org.apache.flex.core.IBead} bead The bead to add.
>+ */
>+org.apache.flex.core.IStrand.prototype.addBead = function(bead) {};
>+
>+
>+/**
>+ * getBeadByType()
>+ *
>+ * @expose
>+ * @param {Object} classOrInterface The type of bead to look for.
>+ * @return {org.apache.flex.core.IBead} The bead.
>+ */
>+org.apache.flex.core.IStrand.prototype.getBeadByType =
>+    function(classOrInterface) {};
>+
>+
>+/**
>+ * removeBead()
>+ *
>+ * @expose
>+ * @param {org.apache.flex.core.IBead} bead The bead to remove.
>+ * @return {org.apache.flex.core.IBead} The bead that was removed.
>+ */
>+org.apache.flex.core.IStrand.prototype.removeBead = function(bead) {};
>
>http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/9fa2c6f9/frameworks/
>js/FlexJS/src/org/apache/flex/core/SimpleStatesImpl.js
>----------------------------------------------------------------------
>diff --git
>a/frameworks/js/FlexJS/src/org/apache/flex/core/SimpleStatesImpl.js
>b/frameworks/js/FlexJS/src/org/apache/flex/core/SimpleStatesImpl.js
>index e71bc8f..f0fc482 100644
>--- a/frameworks/js/FlexJS/src/org/apache/flex/core/SimpleStatesImpl.js
>+++ b/frameworks/js/FlexJS/src/org/apache/flex/core/SimpleStatesImpl.js
>@@ -14,19 +14,27 @@
>
> goog.provide('org.apache.flex.core.SimpleStatesImpl');
>
>+goog.require('mx.states.AddItems');
>+goog.require('mx.states.SetProperty');
>+goog.require('mx.states.State');
>+goog.require('org.apache.flex.core.IBead');
>+goog.require('org.apache.flex.core.IStatesImpl');
>+goog.require('org.apache.flex.core.IStrand');
> goog.require('org.apache.flex.events.EventDispatcher');
>
>
>
> /**
>  * @constructor
>+ * @implements {org.apache.flex.core.IBead}
>+ * @implements {org.apache.flex.core.IStatesImpl}
>  */
> org.apache.flex.core.SimpleStatesImpl = function() {
>   goog.base(this);
>
>   /**
>    * @private
>-   * @type {Object}
>+   * @type {org.apache.flex.core.IStrand}
>    */
>   this.strand_ = null;
> };
>@@ -36,42 +44,40 @@ goog.inherits(org.apache.flex.core.SimpleStatesImpl,
>
> /**
>  * @expose
>- * @param {Object} value The new host.
>+ * @param {org.apache.flex.core.IStrand} value The new host.
>  */
> org.apache.flex.core.SimpleStatesImpl.prototype.set_strand =
>     function(value) {
>   if (this.strand_ !== value) {
>     this.strand_ = value;
>     this.strand_.addEventListener('currentStateChanged',
>-        goog.bind(this.stateChangeHandler, this));
>+        goog.bind(this.stateChangeHandler_, this));
>   }
> };
>
>
> /**
>- * @protected
>+ * @private
>  * @param {Object} event The event.
>  */
>-org.apache.flex.core.SimpleStatesImpl.prototype.stateChangeHandler =
>+org.apache.flex.core.SimpleStatesImpl.prototype.stateChangeHandler_ =
>     function(event) {
>-  var s, p;
>-  var doc = event.target;
>-  var arr = doc.get_states();
>-  for (p in arr)
>-  {
>+  var arr, doc, p, s;
>+
>+  doc = event.target;
>+  arr = doc.get_states();
>+  for (p in arr) {
>     s = arr[p];
>-    if (s.name == event.oldValue)
>-    {
>-      this.revert(s);
>+    if (s.name === event.oldValue) {
>+      this.revert_(s);
>       break;
>     }
>   }
>-  for (p in arr)
>-  {
>+
>+  for (p in arr) {
>     s = arr[p];
>-    if (s.name == event.newValue)
>-    {
>-      this.applyState(s);
>+    if (s.name === event.newValue) {
>+      this.apply_(s);
>       break;
>     }
>   }
>@@ -79,109 +85,122 @@
>org.apache.flex.core.SimpleStatesImpl.prototype.stateChangeHandler =
>
>
> /**
>- * @protected
>- * @param {Object} s The State to revert.
>+ * @private
>+ * @param {mx.states.State} s The State to revert.
>  */
>-org.apache.flex.core.SimpleStatesImpl.prototype.revert = function(s) {
>-  var p, o;
>-  var arr = s.overrides;
>-  for (p in arr)
>-  {
>+org.apache.flex.core.SimpleStatesImpl.prototype.revert_ = function(s) {
>+  var arr, item, o, p, parent, q, target;
>+
>+  arr = s.overrides;
>+  for (p in arr) {
>     o = arr[p];
>-    if (o.type == 'AddItems')
>-    {
>-      for (var q in o.items)
>-      {
>-        var item = o.items[q];
>-        var parent;
>-        if (typeof(o.document['get_' + o.destination]) == 'function')
>+    if (org.apache.flex.utils.Language.is(o, mx.states.AddItems)) {
>+      for (q in o.items) {
>+        item = o.items[q];
>+
>+        if (typeof(o.document['get_' + o.destination]) === 'function') {
>           parent = o.document['get_' + o.destination]();
>-        else
>+        } else {
>           parent = o.document[o.destination];
>+        }
>+
>         parent.removeElement(item);
>         parent.dispatchEvent(
>             new org.apache.flex.events.Event('childrenAdded'));
>       }
>-    }
>-    else if (o.type == 'SetProperty')
>-    {
>-      var target;
>-      if (typeof(o.document['get_' + o.target]) == 'function')
>+    } else if (org.apache.flex.utils.Language.is(o,
>mx.states.SetProperty)) {
>+      if (typeof(o.document['get_' + o.target]) === 'function') {
>         target = o.document['get_' + o.target]();
>-      else
>+      } else {
>         target = o.document[o.target];
>-      if (typeof(target['set_' + o.name]) == 'function')
>+      }
>+
>+      if (typeof(target['set_' + o.name]) === 'function') {
>         target['set_' + o.name](o.previousValue);
>-      else
>+      } else {
>         target[o.name] = o.previousValue;
>+      }
>     }
>   }
> };
>
>
> /**
>- * @protected
>- * @param {Object} s The State to apply.
>+ * @private
>+ * @param {mx.states.State} s The State to apply.
>  */
>-org.apache.flex.core.SimpleStatesImpl.prototype.applyState = function(s)
>{
>-  var o, p;
>-  var arr = s.overrides;
>-  for (p in arr)
>-  {
>+org.apache.flex.core.SimpleStatesImpl.prototype.apply_ = function(s) {
>+  var arr, child, index, item, o, p, parent, q, target;
>+
>+  arr = s.overrides;
>+  for (p in arr) {
>     o = arr[p];
>-    if (o.type == 'AddItems')
>-    {
>-      if (o.items == null)
>-      {
>+    if (org.apache.flex.utils.Language.is(o, mx.states.AddItems)) {
>+      if (!o.items) {
>         //TODO (aharui).  This array should be deferred
>         //var di = org.apache.flex.utils.MXMLDataInterpreter;
>         //o.items = di.generateMXMLArray(o.document,
>         //                                null, o.itemsDescriptor, true);
>         o.items = o.itemsDescriptor;
>       }
>-      for (var q in o.items)
>-      {
>-        var item = o.items[q];
>-        var parent;
>-        if (typeof(o.document['get_' + o.destination]) == 'function')
>+
>+      for (q in o.items) {
>+        item = o.items[q];
>+
>+        if (typeof(o.document['get_' + o.destination]) === 'function') {
>           parent = o.document['get_' + o.destination]();
>-        else
>+        } else {
>           parent = o.document[o.destination];
>-        if (o.relativeTo != null)
>-        {
>-          var child;
>-          if (typeof(o.document['get_' + o.relativeTo]) == 'function')
>+        }
>+
>+        if (o.relativeTo) {
>+          if (typeof(o.document['get_' + o.relativeTo]) === 'function') {
>             child = o.document['get_' + o.relativeTo]();
>-          else
>+          } else {
>             child = o.document[o.relativeTo];
>-          var index = parent.getElementIndex(child);
>-          if (o.position == 'after')
>+          }
>+
>+          index = parent.getElementIndex(child);
>+          if (o.position === 'after') {
>             index++;
>+          }
>+
>           parent.addElementAt(item, index);
>-        }
>-        else
>-        {
>+        } else {
>           parent.addElement(item);
>         }
>+
>         parent.dispatchEvent(
>             new org.apache.flex.events.Event('childrenAdded'));
>       }
>     }
>-    else if (o.type == 'SetProperty')
>+    else if (org.apache.flex.utils.Language.is(o, mx.states.SetProperty))
>     {
>-      var target;
>-      if (typeof(o.document['get_' + o.target]) == 'function')
>+      if (typeof(o.document['get_' + o.target]) === 'function') {
>         target = o.document['get_' + o.target]();
>-      else
>+      } else {
>         target = o.document[o.target];
>-      if (typeof(target['get_' + o.name]) == 'function')
>+      }
>+
>+      if (typeof(target['get_' + o.name]) === 'function') {
>         o.previousValue = target['get_' + o.name]();
>-      else
>+      } else {
>         o.previousValue = target[o.name];
>-      if (typeof(target['set_' + o.name]) == 'function')
>+      }
>+
>+      if (typeof(target['set_' + o.name]) === 'function') {
>         target['set_' + o.name](o.value);
>-      else
>+      } else {
>         target[o.name] = o.value;
>+      }
>     }
>   }
> };
>+
>+
>+/**
>+ * @const
>+ */
>+org.apache.flex.core.SimpleStatesImpl.prototype.FLEXJS_CLASS_INFO =
>+    { interfaces: [org.apache.flex.core.IBead,
>+                   org.apache.flex.core.IStatesImpl] };
>
>http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/9fa2c6f9/frameworks/
>js/FlexJS/src/org/apache/flex/events/IEventDispatcher.js
>----------------------------------------------------------------------
>diff --git
>a/frameworks/js/FlexJS/src/org/apache/flex/events/IEventDispatcher.js
>b/frameworks/js/FlexJS/src/org/apache/flex/events/IEventDispatcher.js
>new file mode 100644
>index 0000000..401e976
>--- /dev/null
>+++ b/frameworks/js/FlexJS/src/org/apache/flex/events/IEventDispatcher.js
>@@ -0,0 +1,25 @@
>+/**
>+ * Licensed 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.
>+ */
>+
>+goog.provide('org.apache.flex.events.IEventDispatcher');
>+
>+
>+
>+/**
>+ * IEventDispatcher
>+ *
>+ * @interface
>+ */
>+org.apache.flex.events.IEventDispatcher = function() {
>+};
>

Reply via email to