diff --git a/tests/optional_scalars/ScalarStuff.nim b/tests/optional_scalars/ScalarStuff.nim
new file mode 100644
index 0000000..6df1403
--- /dev/null
+++ b/tests/optional_scalars/ScalarStuff.nim
@@ -0,0 +1,331 @@
+#[ optional_scalars.ScalarStuff
+  Automatically generated by the FlatBuffers compiler, do not modify.
+  Or modify. I'm a message, not a cop.
+
+  flatc version: 22.10.26
+
+  Declared by  : 
+  Rooting type : optional_scalars.ScalarStuff ()
+]#
+
+import OptionalByte as optional_scalars_OptionalByte
+import flatbuffers
+import std/options
+
+type ScalarStuff* = object of FlatObj
+func justI8*(self: ScalarStuff): int8 =
+  let o = self.tab.Offset(4)
+  if o != 0:
+    return Get[int8](self.tab, self.tab.Pos + o)
+  return 0
+func `justI8=`*(self: var ScalarStuff, n: int8): bool =
+  return self.tab.MutateSlot(4, n)
+func maybeI8*(self: ScalarStuff): Option[int8] =
+  let o = self.tab.Offset(6)
+  if o != 0:
+    return some(Get[int8](self.tab, self.tab.Pos + o))
+func `maybeI8=`*(self: var ScalarStuff, n: Option[int8]): bool =
+  return self.tab.MutateSlot(6, n)
+func defaultI8*(self: ScalarStuff): int8 =
+  let o = self.tab.Offset(8)
+  if o != 0:
+    return Get[int8](self.tab, self.tab.Pos + o)
+  return 42
+func `defaultI8=`*(self: var ScalarStuff, n: int8): bool =
+  return self.tab.MutateSlot(8, n)
+func justU8*(self: ScalarStuff): uint8 =
+  let o = self.tab.Offset(10)
+  if o != 0:
+    return Get[uint8](self.tab, self.tab.Pos + o)
+  return 0
+func `justU8=`*(self: var ScalarStuff, n: uint8): bool =
+  return self.tab.MutateSlot(10, n)
+func maybeU8*(self: ScalarStuff): Option[uint8] =
+  let o = self.tab.Offset(12)
+  if o != 0:
+    return some(Get[uint8](self.tab, self.tab.Pos + o))
+func `maybeU8=`*(self: var ScalarStuff, n: Option[uint8]): bool =
+  return self.tab.MutateSlot(12, n)
+func defaultU8*(self: ScalarStuff): uint8 =
+  let o = self.tab.Offset(14)
+  if o != 0:
+    return Get[uint8](self.tab, self.tab.Pos + o)
+  return 42
+func `defaultU8=`*(self: var ScalarStuff, n: uint8): bool =
+  return self.tab.MutateSlot(14, n)
+func justI16*(self: ScalarStuff): int16 =
+  let o = self.tab.Offset(16)
+  if o != 0:
+    return Get[int16](self.tab, self.tab.Pos + o)
+  return 0
+func `justI16=`*(self: var ScalarStuff, n: int16): bool =
+  return self.tab.MutateSlot(16, n)
+func maybeI16*(self: ScalarStuff): Option[int16] =
+  let o = self.tab.Offset(18)
+  if o != 0:
+    return some(Get[int16](self.tab, self.tab.Pos + o))
+func `maybeI16=`*(self: var ScalarStuff, n: Option[int16]): bool =
+  return self.tab.MutateSlot(18, n)
+func defaultI16*(self: ScalarStuff): int16 =
+  let o = self.tab.Offset(20)
+  if o != 0:
+    return Get[int16](self.tab, self.tab.Pos + o)
+  return 42
+func `defaultI16=`*(self: var ScalarStuff, n: int16): bool =
+  return self.tab.MutateSlot(20, n)
+func justU16*(self: ScalarStuff): uint16 =
+  let o = self.tab.Offset(22)
+  if o != 0:
+    return Get[uint16](self.tab, self.tab.Pos + o)
+  return 0
+func `justU16=`*(self: var ScalarStuff, n: uint16): bool =
+  return self.tab.MutateSlot(22, n)
+func maybeU16*(self: ScalarStuff): Option[uint16] =
+  let o = self.tab.Offset(24)
+  if o != 0:
+    return some(Get[uint16](self.tab, self.tab.Pos + o))
+func `maybeU16=`*(self: var ScalarStuff, n: Option[uint16]): bool =
+  return self.tab.MutateSlot(24, n)
+func defaultU16*(self: ScalarStuff): uint16 =
+  let o = self.tab.Offset(26)
+  if o != 0:
+    return Get[uint16](self.tab, self.tab.Pos + o)
+  return 42
+func `defaultU16=`*(self: var ScalarStuff, n: uint16): bool =
+  return self.tab.MutateSlot(26, n)
+func justI32*(self: ScalarStuff): int32 =
+  let o = self.tab.Offset(28)
+  if o != 0:
+    return Get[int32](self.tab, self.tab.Pos + o)
+  return 0
+func `justI32=`*(self: var ScalarStuff, n: int32): bool =
+  return self.tab.MutateSlot(28, n)
+func maybeI32*(self: ScalarStuff): Option[int32] =
+  let o = self.tab.Offset(30)
+  if o != 0:
+    return some(Get[int32](self.tab, self.tab.Pos + o))
+func `maybeI32=`*(self: var ScalarStuff, n: Option[int32]): bool =
+  return self.tab.MutateSlot(30, n)
+func defaultI32*(self: ScalarStuff): int32 =
+  let o = self.tab.Offset(32)
+  if o != 0:
+    return Get[int32](self.tab, self.tab.Pos + o)
+  return 42
+func `defaultI32=`*(self: var ScalarStuff, n: int32): bool =
+  return self.tab.MutateSlot(32, n)
+func justU32*(self: ScalarStuff): uint32 =
+  let o = self.tab.Offset(34)
+  if o != 0:
+    return Get[uint32](self.tab, self.tab.Pos + o)
+  return 0
+func `justU32=`*(self: var ScalarStuff, n: uint32): bool =
+  return self.tab.MutateSlot(34, n)
+func maybeU32*(self: ScalarStuff): Option[uint32] =
+  let o = self.tab.Offset(36)
+  if o != 0:
+    return some(Get[uint32](self.tab, self.tab.Pos + o))
+func `maybeU32=`*(self: var ScalarStuff, n: Option[uint32]): bool =
+  return self.tab.MutateSlot(36, n)
+func defaultU32*(self: ScalarStuff): uint32 =
+  let o = self.tab.Offset(38)
+  if o != 0:
+    return Get[uint32](self.tab, self.tab.Pos + o)
+  return 42
+func `defaultU32=`*(self: var ScalarStuff, n: uint32): bool =
+  return self.tab.MutateSlot(38, n)
+func justI64*(self: ScalarStuff): int64 =
+  let o = self.tab.Offset(40)
+  if o != 0:
+    return Get[int64](self.tab, self.tab.Pos + o)
+  return 0
+func `justI64=`*(self: var ScalarStuff, n: int64): bool =
+  return self.tab.MutateSlot(40, n)
+func maybeI64*(self: ScalarStuff): Option[int64] =
+  let o = self.tab.Offset(42)
+  if o != 0:
+    return some(Get[int64](self.tab, self.tab.Pos + o))
+func `maybeI64=`*(self: var ScalarStuff, n: Option[int64]): bool =
+  return self.tab.MutateSlot(42, n)
+func defaultI64*(self: ScalarStuff): int64 =
+  let o = self.tab.Offset(44)
+  if o != 0:
+    return Get[int64](self.tab, self.tab.Pos + o)
+  return 42
+func `defaultI64=`*(self: var ScalarStuff, n: int64): bool =
+  return self.tab.MutateSlot(44, n)
+func justU64*(self: ScalarStuff): uint64 =
+  let o = self.tab.Offset(46)
+  if o != 0:
+    return Get[uint64](self.tab, self.tab.Pos + o)
+  return 0
+func `justU64=`*(self: var ScalarStuff, n: uint64): bool =
+  return self.tab.MutateSlot(46, n)
+func maybeU64*(self: ScalarStuff): Option[uint64] =
+  let o = self.tab.Offset(48)
+  if o != 0:
+    return some(Get[uint64](self.tab, self.tab.Pos + o))
+func `maybeU64=`*(self: var ScalarStuff, n: Option[uint64]): bool =
+  return self.tab.MutateSlot(48, n)
+func defaultU64*(self: ScalarStuff): uint64 =
+  let o = self.tab.Offset(50)
+  if o != 0:
+    return Get[uint64](self.tab, self.tab.Pos + o)
+  return 42
+func `defaultU64=`*(self: var ScalarStuff, n: uint64): bool =
+  return self.tab.MutateSlot(50, n)
+func justF32*(self: ScalarStuff): float32 =
+  let o = self.tab.Offset(52)
+  if o != 0:
+    return Get[float32](self.tab, self.tab.Pos + o)
+  return 0.0
+func `justF32=`*(self: var ScalarStuff, n: float32): bool =
+  return self.tab.MutateSlot(52, n)
+func maybeF32*(self: ScalarStuff): Option[float32] =
+  let o = self.tab.Offset(54)
+  if o != 0:
+    return some(Get[float32](self.tab, self.tab.Pos + o))
+func `maybeF32=`*(self: var ScalarStuff, n: Option[float32]): bool =
+  return self.tab.MutateSlot(54, n)
+func defaultF32*(self: ScalarStuff): float32 =
+  let o = self.tab.Offset(56)
+  if o != 0:
+    return Get[float32](self.tab, self.tab.Pos + o)
+  return 42.0
+func `defaultF32=`*(self: var ScalarStuff, n: float32): bool =
+  return self.tab.MutateSlot(56, n)
+func justF64*(self: ScalarStuff): float64 =
+  let o = self.tab.Offset(58)
+  if o != 0:
+    return Get[float64](self.tab, self.tab.Pos + o)
+  return 0.0
+func `justF64=`*(self: var ScalarStuff, n: float64): bool =
+  return self.tab.MutateSlot(58, n)
+func maybeF64*(self: ScalarStuff): Option[float64] =
+  let o = self.tab.Offset(60)
+  if o != 0:
+    return some(Get[float64](self.tab, self.tab.Pos + o))
+func `maybeF64=`*(self: var ScalarStuff, n: Option[float64]): bool =
+  return self.tab.MutateSlot(60, n)
+func defaultF64*(self: ScalarStuff): float64 =
+  let o = self.tab.Offset(62)
+  if o != 0:
+    return Get[float64](self.tab, self.tab.Pos + o)
+  return 42.0
+func `defaultF64=`*(self: var ScalarStuff, n: float64): bool =
+  return self.tab.MutateSlot(62, n)
+func justBool*(self: ScalarStuff): bool =
+  let o = self.tab.Offset(64)
+  if o != 0:
+    return Get[bool](self.tab, self.tab.Pos + o)
+  return false
+func `justBool=`*(self: var ScalarStuff, n: bool): bool =
+  return self.tab.MutateSlot(64, n)
+func maybeBool*(self: ScalarStuff): Option[bool] =
+  let o = self.tab.Offset(66)
+  if o != 0:
+    return some(Get[bool](self.tab, self.tab.Pos + o))
+func `maybeBool=`*(self: var ScalarStuff, n: Option[bool]): bool =
+  return self.tab.MutateSlot(66, n)
+func defaultBool*(self: ScalarStuff): bool =
+  let o = self.tab.Offset(68)
+  if o != 0:
+    return Get[bool](self.tab, self.tab.Pos + o)
+  return true
+func `defaultBool=`*(self: var ScalarStuff, n: bool): bool =
+  return self.tab.MutateSlot(68, n)
+func justEnum*(self: ScalarStuff): optional_scalars_OptionalByte.OptionalByte =
+  let o = self.tab.Offset(70)
+  if o != 0:
+    return optional_scalars_OptionalByte.OptionalByte(Get[int8](self.tab, self.tab.Pos + o))
+  return type(result)(0)
+func `justEnum=`*(self: var ScalarStuff, n: optional_scalars_OptionalByte.OptionalByte): bool =
+  return self.tab.MutateSlot(70, n)
+func maybeEnum*(self: ScalarStuff): Option[optional_scalars_OptionalByte.OptionalByte] =
+  let o = self.tab.Offset(72)
+  if o != 0:
+    return some(optional_scalars_OptionalByte.OptionalByte(Get[int8](self.tab, self.tab.Pos + o)))
+func `maybeEnum=`*(self: var ScalarStuff, n: Option[optional_scalars_OptionalByte.OptionalByte]): bool =
+  return self.tab.MutateSlot(72, n)
+func defaultEnum*(self: ScalarStuff): optional_scalars_OptionalByte.OptionalByte =
+  let o = self.tab.Offset(74)
+  if o != 0:
+    return optional_scalars_OptionalByte.OptionalByte(Get[int8](self.tab, self.tab.Pos + o))
+  return type(result)(1)
+func `defaultEnum=`*(self: var ScalarStuff, n: optional_scalars_OptionalByte.OptionalByte): bool =
+  return self.tab.MutateSlot(74, n)
+proc ScalarStuffStart*(builder: var Builder) =
+  builder.StartObject(36)
+proc ScalarStuffAddjustI8*(builder: var Builder, justI8: int8) =
+  builder.PrependSlot(0, justI8, default(int8))
+proc ScalarStuffAddmaybeI8*(builder: var Builder, maybeI8: int8) =
+  builder.PrependSlot(1, maybeI8, default(int8))
+proc ScalarStuffAdddefaultI8*(builder: var Builder, defaultI8: int8) =
+  builder.PrependSlot(2, defaultI8, default(int8))
+proc ScalarStuffAddjustU8*(builder: var Builder, justU8: uint8) =
+  builder.PrependSlot(3, justU8, default(uint8))
+proc ScalarStuffAddmaybeU8*(builder: var Builder, maybeU8: uint8) =
+  builder.PrependSlot(4, maybeU8, default(uint8))
+proc ScalarStuffAdddefaultU8*(builder: var Builder, defaultU8: uint8) =
+  builder.PrependSlot(5, defaultU8, default(uint8))
+proc ScalarStuffAddjustI16*(builder: var Builder, justI16: int16) =
+  builder.PrependSlot(6, justI16, default(int16))
+proc ScalarStuffAddmaybeI16*(builder: var Builder, maybeI16: int16) =
+  builder.PrependSlot(7, maybeI16, default(int16))
+proc ScalarStuffAdddefaultI16*(builder: var Builder, defaultI16: int16) =
+  builder.PrependSlot(8, defaultI16, default(int16))
+proc ScalarStuffAddjustU16*(builder: var Builder, justU16: uint16) =
+  builder.PrependSlot(9, justU16, default(uint16))
+proc ScalarStuffAddmaybeU16*(builder: var Builder, maybeU16: uint16) =
+  builder.PrependSlot(10, maybeU16, default(uint16))
+proc ScalarStuffAdddefaultU16*(builder: var Builder, defaultU16: uint16) =
+  builder.PrependSlot(11, defaultU16, default(uint16))
+proc ScalarStuffAddjustI32*(builder: var Builder, justI32: int32) =
+  builder.PrependSlot(12, justI32, default(int32))
+proc ScalarStuffAddmaybeI32*(builder: var Builder, maybeI32: int32) =
+  builder.PrependSlot(13, maybeI32, default(int32))
+proc ScalarStuffAdddefaultI32*(builder: var Builder, defaultI32: int32) =
+  builder.PrependSlot(14, defaultI32, default(int32))
+proc ScalarStuffAddjustU32*(builder: var Builder, justU32: uint32) =
+  builder.PrependSlot(15, justU32, default(uint32))
+proc ScalarStuffAddmaybeU32*(builder: var Builder, maybeU32: uint32) =
+  builder.PrependSlot(16, maybeU32, default(uint32))
+proc ScalarStuffAdddefaultU32*(builder: var Builder, defaultU32: uint32) =
+  builder.PrependSlot(17, defaultU32, default(uint32))
+proc ScalarStuffAddjustI64*(builder: var Builder, justI64: int64) =
+  builder.PrependSlot(18, justI64, default(int64))
+proc ScalarStuffAddmaybeI64*(builder: var Builder, maybeI64: int64) =
+  builder.PrependSlot(19, maybeI64, default(int64))
+proc ScalarStuffAdddefaultI64*(builder: var Builder, defaultI64: int64) =
+  builder.PrependSlot(20, defaultI64, default(int64))
+proc ScalarStuffAddjustU64*(builder: var Builder, justU64: uint64) =
+  builder.PrependSlot(21, justU64, default(uint64))
+proc ScalarStuffAddmaybeU64*(builder: var Builder, maybeU64: uint64) =
+  builder.PrependSlot(22, maybeU64, default(uint64))
+proc ScalarStuffAdddefaultU64*(builder: var Builder, defaultU64: uint64) =
+  builder.PrependSlot(23, defaultU64, default(uint64))
+proc ScalarStuffAddjustF32*(builder: var Builder, justF32: float32) =
+  builder.PrependSlot(24, justF32, default(float32))
+proc ScalarStuffAddmaybeF32*(builder: var Builder, maybeF32: float32) =
+  builder.PrependSlot(25, maybeF32, default(float32))
+proc ScalarStuffAdddefaultF32*(builder: var Builder, defaultF32: float32) =
+  builder.PrependSlot(26, defaultF32, default(float32))
+proc ScalarStuffAddjustF64*(builder: var Builder, justF64: float64) =
+  builder.PrependSlot(27, justF64, default(float64))
+proc ScalarStuffAddmaybeF64*(builder: var Builder, maybeF64: float64) =
+  builder.PrependSlot(28, maybeF64, default(float64))
+proc ScalarStuffAdddefaultF64*(builder: var Builder, defaultF64: float64) =
+  builder.PrependSlot(29, defaultF64, default(float64))
+proc ScalarStuffAddjustBool*(builder: var Builder, justBool: bool) =
+  builder.PrependSlot(30, justBool, default(bool))
+proc ScalarStuffAddmaybeBool*(builder: var Builder, maybeBool: bool) =
+  builder.PrependSlot(31, maybeBool, default(bool))
+proc ScalarStuffAdddefaultBool*(builder: var Builder, defaultBool: bool) =
+  builder.PrependSlot(32, defaultBool, default(bool))
+proc ScalarStuffAddjustEnum*(builder: var Builder, justEnum: int8) =
+  builder.PrependSlot(33, justEnum, default(int8))
+proc ScalarStuffAddmaybeEnum*(builder: var Builder, maybeEnum: int8) =
+  builder.PrependSlot(34, maybeEnum, default(int8))
+proc ScalarStuffAdddefaultEnum*(builder: var Builder, defaultEnum: int8) =
+  builder.PrependSlot(35, defaultEnum, default(int8))
+proc ScalarStuffEnd*(builder: var Builder): uoffset =
+  return builder.EndObject()
