Nicolas Cannasse 20 lat temu
rodzic
commit
89a009cb41
1 zmienionych plików z 116 dodań i 0 usunięć
  1. 116 0
      std/Reflect.hx

+ 116 - 0
std/Reflect.hx

@@ -0,0 +1,116 @@
+
+class Reflect {
+
+	public static function makeNew( cl : Dynamic, args : Array<Dynamic> ) : Dynamic {
+		return untyped
+		#flash
+			switch( args.length ) {
+			case 0:
+				__new__(cl);
+			case 1:
+				__new__(cl,args[0]);
+			case 2:
+				__new__(cl,args[0],args[1]);
+			case 3:
+				__new__(cl,args[0],args[1],args[2]);
+			case 4:
+				__new__(cl,args[0],args[1],args[2],args[3]);
+			case 5:
+				__new__(cl,args[0],args[1],args[2],args[3],args[4]);
+			default:
+				throw "Too many arguments";
+			}
+		#else neko
+			__dollar__call(__dollar__objget(cl,__dollar__hash("new".__s)),cl,args.__a)
+		#else error
+		#end
+			;
+	}
+
+	public static function haveField( o : Dynamic, field : String ) : Bool {
+		return untyped
+		#flash
+			o.hasOwnProperty(field)
+		#else neko
+			__dollar__typeof(o) == __dollar__tobject && __dollar__objfield(o,__dollar__hash(field.__s))
+		#else error
+		#end
+			;
+	}
+
+	public static function field( o : Dynamic, field : String ) : Dynamic {
+		return untyped
+		#flash
+			{
+				var f = o[field];
+				if( f == null && !o.hasOwnProperty(f) )
+					throw ("No such field : " + field);
+				return f;
+			}
+		#else neko
+			{
+				if( __dollar__typeof(o) != __dollar__tobject )
+					throw ("No such field : " + field);
+				var fh = __dollar__hash(field.__s);
+				var f = __dollar__objget(o,fh);
+				if( f == null && !__dollar__objfield(o,fh) )
+					throw ("No such field : " + field);
+				return f;
+			}
+		#else error
+		#end
+			;
+	}
+
+	public static function setField( o : Dynamic, field : String, value : Dynamic ) : Void {
+		untyped {
+		#flash
+			o[field] = value;
+		#else neko
+			if( __dollar__typeof(o) == __dollar__tobject )
+				__dollar__objset(o,__dollar__hash(field.__s),value);
+		#else error
+		#end
+		}
+	}
+
+	public static function callField( o : Dynamic, func : Dynamic, args : Array<Dynamic> ) : Dynamic {
+		return untyped
+		#flash
+			func.apply(o,args)
+		#else neko
+			__dollar__call(func,o,args.__a)
+		#else error
+		#end
+			;
+	}
+
+	public static function fields( o : Dynamic ) : Array<String> {
+		return untyped
+		#flash
+			__keys__(o)
+		#else neko
+			if( __dollar__typeof(o) != __dollar__tobject )
+				new Array<String>();
+			else {
+				var a = __dollar__objfields(o);
+				var i = 0, j = 0;
+				var hclass = __dollar__hash("__class__".__s);
+				var l = __dollar__asize(a);
+				while( i < l ) {
+					if( a[i] == hclass )
+						i++;
+					else {
+						a[j] = new String(__dollar__field(a[i]));
+						i++;
+						j++;
+					}
+				}
+				Array.new1(a,j);
+			}
+		#else error
+		#end
+			;
+	}
+
+}