diff --git a/src/as/com/threerings/util/ClassUtil.as b/src/as/com/threerings/util/ClassUtil.as index 97bad3932..72000622a 100644 --- a/src/as/com/threerings/util/ClassUtil.as +++ b/src/as/com/threerings/util/ClassUtil.as @@ -21,6 +21,8 @@ package com.threerings.util { +import flash.system.ApplicationDomain; + import flash.utils.describeType; import flash.utils.getQualifiedClassName; import flash.utils.getDefinitionByName; @@ -62,9 +64,9 @@ public class ClassUtil * Return a new instance that is the same class as the specified * object. The class must have a zero-arg constructor. */ - public static function newInstance (obj :Object) :Object + public static function newInstance (obj :Object, appDom :ApplicationDomain = null) :Object { - var clazz :Class = getClass(obj); + var clazz :Class = getClass(obj, appDom); return new clazz(); } @@ -73,16 +75,26 @@ public class ClassUtil return (getQualifiedClassName(obj1) == getQualifiedClassName(obj2)); } - public static function getClass (obj :Object) :Class + public static function getClass (obj :Object, appDom :ApplicationDomain = null) :Class { - return getClassByName(getQualifiedClassName(obj)); + return getClassByName(getQualifiedClassName(obj), appDom); } - public static function getClassByName (cname :String) :Class + public static function getClassByName (cname :String, appDom :ApplicationDomain = null) :Class { try { - // see also ApplicationDomain.currentDomain.getClass(cname) - return (getDefinitionByName(cname.replace("::", ".")) as Class); + cname = cname.replace("::", "."); + if (appDom != null) { + try { + var c :Class = appDom.getDefinition(cname) as Class; + if (c != null) { + return c; + } + } catch (err :Error) { + // fall through + } + } + return (getDefinitionByName(cname) as Class); } catch (error :ReferenceError) { var log :Log = Log.getLog(ClassUtil);