package aw.utils{
import __AS3__.vec.Vector;
import flash.errors.IllegalOperationError;
import flash.system.ApplicationDomain;
import flash.utils.Proxy;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
/**
* Class for working with object classes/definitions.
* Allows you to create instances of classes by name or Class object.
* @example
package {
import aw.utils.ClassUtils;
import flash.display.Sprite;
import flash.filters.DropShadowFilter;
public class Test extends Sprite{
public function Test():void{
super();
var filter1:DropShadowFilter = ClassUtils.apply(DropShadowFilter, [4, 45, 0, 1, 4, 4, 1]);
var filter2:DropShadowFilter = ClassUtils.applyByName("flash.filters.DropShadowFilter", [4, 45, 0, 1, 4, 4, 1]);
var filter3:DropShadowFilter = ClassUtils.call(DropShadowFilter, 4, 45, 0, 1, 4, 4, 1);
var filter4:DropShadowFilter = ClassUtils.callByName("flash.filters.DropShadowFilter", 4, 45, 0, 1, 4, 4, 1);
}
}
}
* Provides a method for obtaining an class instance from Class object.
* @example
package {
import aw.utils.ClassUtils;
import flash.display.Sprite;
import flash.filters.DropShadowFilter;
public class Test extends Sprite{
public function Test():void{
super();
trace(ClassUtils.getClassDefinition(this));
var filter:DropShadowFilter = new DropShadowFilter();
trace(ClassUtils.getClassDefinition(filter));
}
}
}
/* trace output
[class Test]
[class DropShadowFilter]
*/
* @author Galaburda a_[w] Oleg http://www.actualwave.com
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
public class ClassUtils extends Object{
/**
* @private
*/
static public const VECTOR_CLASS_NAME:String = getQualifiedClassName(Vector);
/**
* @private
*/
static public const WRONG_NAME_ERROR:String = 'ClassUtils Error: can\'t found [$cls] class definition by name';
/**
* @private (protected)
*/
static protected const classCallers:Array = [call0Class, call1Class, call2Class, call3Class, call4Class, call5Class, call6Class, call7Class, call8Class, call9Class, call10Class, call11Class, call12Class, call13Class, call14Class, call15Class];
/**
* Returns an Class object by its instance
*
* @param any Class instance
* @return Class
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static public function getClassDefinition(any:*):Class{
var cls:Object = null;
if(any is Proxy) cls = getDefinitionByName(getQualifiedClassName(any));
else cls = Object(any).constructor;
return cls as Class;
}
/**
* Get Vector class defnition with selected elements type
* @param itemDefinition Selected element type
* @param applicationDomain Application domain of element type
* @return Vector class definition
*
*/
static public function getVectorDefinition(itemDefinition:Class, applicationDomain:ApplicationDomain=null):Class{
if(!applicationDomain) applicationDomain = ApplicationDomain.currentDomain;
return applicationDomain.getDefinition(VECTOR_CLASS_NAME+'.<'+getQualifiedClassName(itemDefinition)+'>') as Class;
}
/**
* Create Vector class instance with selected elements type
* @param itemDefinition Selected element type
* @param length Vector length
* @param fixed Fixed length
* @param applicationDomain Application domain of element type
* @return Vector class instance
*
*/
static public function createCustomVector(itemDefinition:Class, length:uint=0, fixed:Boolean=false, applicationDomain:ApplicationDomain=null):Vector.<*>{
var definition:Class = getVectorDefinition(itemDefinition, applicationDomain);
return new definition(length, fixed);
}
/**
* Returns the name of the class.
*
* @param cls Class object, a instance of it or name (if set name of a non-existent class, it returns the class name "String")
* @return String
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static public function getClassName(cls:*):String{
if(cls is String && ApplicationDomain.currentDomain.hasDefinition(cls)) return cls;
else return getQualifiedClassName(cls);
}
/**
* Emulates the same method of the Function class.
*
* @param cls Class object, a copy of which will be retrieved
* @param arr List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static public function apply(cls:Object, arr:Array=null):*{
if(!arr) arr = [];
var f:Function = classCallers[arr.length];
if(f!=null) return f(cls, arr);
else throw new Error(cantCreateErrorString(getQualifiedClassName(cls)));
}
/**
* Creates a copy of the class by its name, passing in the constructor parameters from the array
*
* @param name Class name, which instance to get
* @param arr List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static public function applyByName(name:String, arr:Array=null):*{
var ad:ApplicationDomain = ApplicationDomain.currentDomain;
var cls:Class;
if(ad.hasDefinition(name)){
cls = ad.getDefinition(name) as Class;
}
if(!cls) throw new IllegalOperationError(WRONG_NAME_ERROR.split('$cls').join(name));
if(!arr) arr = [];
var f:Function = classCallers[arr.length];
if(f!=null) return f(cls, arr);
else throw new Error(cantCreateErrorString(name));
}
/**
* Emulates the same method of the Function class.
*
* @param cls Class object
* @param ...args List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static public function call(cls:Object, ...args:Array):*{
var f:Function = classCallers[args.length];
if(f!=null) return f(cls, args);
else throw new Error(cantCreateErrorString(getQualifiedClassName(cls)));
}
/**
* Creates a copy of the class by its name, passing in the constructor, all parameters following by the class name.
*
* @param cls Class object
* @param ...args List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static public function callByName(name:String, ...args:Array):*{
var ad:ApplicationDomain = ApplicationDomain.currentDomain;
var cls:Class;
if(ad.hasDefinition(name)){
cls = ad.getDefinition(name) as Class;
}
if(!cls) throw new IllegalOperationError(WRONG_NAME_ERROR);
var f:Function = classCallers[args.length];
if(f!=null) return f(cls, args);
else throw new Error(cantCreateErrorString(getQualifiedClassName(cls)));
}
/**
* Get a reference to the method, which creates a copy of the class, by the number of arguments
* @private
* @param i Number of arguments
* @return Function
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static public function getClassCaller(i:uint):Function{
return classCallers[i];
}
/**
* Get instance of class, which constructor takes no parameters
* @private
* @param cls Class object
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call0Class(cls:Object, a:Array=null):*{
return new cls();
}
/**
* Get instance of class, which constructor takes 1 parameter
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call1Class(cls:Object, a:Array):*{
return new cls(a[0]);
}
/**
* Get instance of class, which constructor takes 2 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call2Class(cls:Object, a:Array):*{
return new cls(a[0], a[1]);
}
/**
* Get instance of class, which constructor takes 3 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call3Class(cls:Object, a:Array):*{
return new cls(a[0], a[1], a[2]);
}
/**
* Get instance of class, which constructor takes 4 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call4Class(cls:Object, a:Array):*{
return new cls(a[0], a[1], a[2], a[3]);
}
/**
* Get instance of class, which constructor takes 5 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call5Class(cls:Object, a:Array):*{
return new cls(a[0], a[1], a[2], a[3], a[4]);
}
/**
* Get instance of class, which constructor takes 6 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call6Class(cls:Object, a:Array):*{
return new cls(a[0], a[1], a[2], a[3], a[4], a[5]);
}
/**
* Get instance of class, which constructor takes 7 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call7Class(cls:Object, a:Array):*{
return new cls(a[0], a[1], a[2], a[3], a[4], a[5], a[6]);
}
/**
* Get instance of class, which constructor takes 8 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call8Class(cls:Object, a:Array):*{
return new cls(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
}
/**
* Get instance of class, which constructor takes 9 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call9Class(cls:Object, a:Array):*{
return new cls(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);
}
/**
* Get instance of class, which constructor takes 10 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call10Class(cls:Object, a:Array):*{
return new cls(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]);
}
/**
* Get instance of class, which constructor takes 11 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call11Class(cls:Object, a:Array):*{
return new cls(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10]);
}
/**
* Get instance of class, which constructor takes 12 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call12Class(cls:Object, a:Array):*{
return new cls(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]);
}
/**
* Get instance of class, which constructor takes 13 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call13Class(cls:Object, a:Array):*{
return new cls(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12]);
}
/**
* Get instance of class, which constructor takes 14 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call14Class(cls:Object, a:Array):*{
return new cls(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13]);
}
/**
* Get instance of class, which constructor takes 15 parameters
* @private
* @param cls Class object
* @param a List of parameters for constructor
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function call15Class(cls:Object, a:Array):*{
return new cls(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14]);
}
/**
* Creates an error message
* @private
* @param cls Class name, that caused the error
* @return *
* @playerversion Flash 9.0.28.0
* @langversion 3.0
*/
static private function cantCreateErrorString(name:String):String{
return 'ClassUtils can\'t create "'+name+'" instance.'
}
}
}