diff --git a/tests/MyGame/Example/Ability.java b/tests/MyGame/Example/Ability.java
index df5fe71..4eb5ac4 100644
--- a/tests/MyGame/Example/Ability.java
+++ b/tests/MyGame/Example/Ability.java
@@ -13,14 +13,14 @@
   public Ability __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
 
   public long id() { return (long)bb.getInt(bb_pos + 0) & 0xFFFFFFFFL; }
-  public void mutateId(long id) { bb.putInt(bb_pos + 0, (int)id); }
+  public void mutateId(long id) { bb.putInt(bb_pos + 0, (int) id); }
   public long distance() { return (long)bb.getInt(bb_pos + 4) & 0xFFFFFFFFL; }
-  public void mutateDistance(long distance) { bb.putInt(bb_pos + 4, (int)distance); }
+  public void mutateDistance(long distance) { bb.putInt(bb_pos + 4, (int) distance); }
 
   public static int createAbility(FlatBufferBuilder builder, long id, long distance) {
     builder.prep(4, 8);
-    builder.putInt((int)distance);
-    builder.putInt((int)id);
+    builder.putInt((int) distance);
+    builder.putInt((int) id);
     return builder.offset();
   }
 
@@ -30,5 +30,23 @@
     public Ability get(int j) { return get(new Ability(), j); }
     public Ability get(Ability obj, int j) {  return obj.__assign(__element(j), bb); }
   }
+  public AbilityT unpack() {
+    AbilityT _o = new AbilityT();
+    unpackTo(_o);
+    return _o;
+  }
+  public void unpackTo(AbilityT _o) {
+    long _oId = id();
+    _o.setId(_oId);
+    long _oDistance = distance();
+    _o.setDistance(_oDistance);
+  }
+  public static int pack(FlatBufferBuilder builder, AbilityT _o) {
+    if (_o == null) return 0;
+    return createAbility(
+      builder,
+      _o.getId(),
+      _o.getDistance());
+  }
 }
 
