Browse Source

allow better subclassing of SPOD

Nicolas Cannasse 13 years ago
parent
commit
abf61b4325
2 changed files with 16 additions and 4 deletions
  1. 1 1
      std/sys/db/Object.hx
  2. 15 3
      std/sys/db/SpodMacros.hx

+ 1 - 1
std/sys/db/Object.hx

@@ -28,7 +28,7 @@ package sys.db;
 	SPOD Object : the persistent object base type. See the tutorial on haXe
 	website to learn how to use SPOD.
 **/
-@:autoBuild(sys.db.SpodMacros.macroBuild())
+@:autoBuild(sys.db.SpodMacros.macroBuild()) @:skipFields
 class Object {
 
 	var _locked(default,never) : Bool;

+ 15 - 3
std/sys/db/SpodMacros.hx

@@ -139,8 +139,12 @@ class SpodMacros {
 		case TInst(c, p):
 			var name = c.toString();
 			var cl = c.get();
-			if( cl.superClass != null && cl.superClass.t.toString() == "sys.db.Object" )
-				return name;
+			var csup = cl.superClass;
+			while( csup != null ) {
+				if( csup.t.toString() == "sys.db.Object" )
+					return name;
+				csup = csup.t.get().superClass;
+			}
 		case TType(t, p):
 			var name = t.toString();
 			if( p.length == 1 && (name == "Null" || name == "sys.db.SNull") ) {
@@ -230,7 +234,15 @@ class SpodMacros {
 		};
 		var c = c.get();
 		var fieldsPos = new Hash();
-		for( f in c.fields.get() ) {
+		var fields = c.fields.get();
+		var csup = c.superClass;
+		while( csup != null ) {
+			var c = csup.t.get();
+			if( !c.meta.has(":skipFields") )
+				fields = fields.concat(c.fields.get());
+			csup = c.superClass;
+		}
+		for( f in fields ) {
 			fieldsPos.set(f.name, f.pos);
 			switch( f.kind ) {
 			case FMethod(_):