@@ -25,6 +25,7 @@ public final class DeconstructedObject implements Iterable<DeconstructedObject.F
2525 * @param <T> type of the object
2626 * @return a codec that converts an instance of {@link T} into a deconstructed object and back
2727 */
28+ // TODO overload method that takes class model
2829 public static <T > Codec <T , DeconstructedObject > codec (Class <T > type ) {
2930 ClassModel classModel = ClassModel .of (type );
3031 ObjectFactory <T > objectFactory = ObjectFactory .create (type , classModel );
@@ -44,6 +45,7 @@ public static <T> Codec<T, DeconstructedObject> codec(Class<T> type) {
4445 * @param <T> type of the object
4546 * @return a data handler that converts an instance of {@link T} into a deconstructed object
4647 */
48+ // TODO overload method that takes class model
4749 public static <T > DataHandler <T , DeconstructedObject > createDeconstructor (Class <T > type ) {
4850 ClassModel classModel = ClassModel .of (type );
4951 return createDeconstructor (classModel , ObjectFactory .create (type , classModel ));
@@ -62,36 +64,16 @@ public static <T> DataHandler<T, DeconstructedObject> createDeconstructor(Class<
6264 * @param <T> type of the object
6365 * @return a data handler that converts deconstructed object into an instance of {@link T}
6466 */
67+ // TODO overload method that takes class model
6568 public static <T > DataHandler <DeconstructedObject , T > createConstructor (Class <T > type ) {
6669 ClassModel classModel = ClassModel .of (type );
6770 return createConstructor (classModel , ObjectFactory .create (type , classModel ));
6871 }
6972
70- // TODO this must also take source class as field names can overlap
71- private final @ Unmodifiable Map <String , Field > fields ;
73+ private final @ Unmodifiable List <Field > fields ;
7274
73- DeconstructedObject (Map <String , Field > fields ) {
74- this .fields = Collections .unmodifiableMap (fields );
75- }
76-
77- /**
78- * Returns field with given name of empty if none exists.
79- *
80- * @param name name of the field
81- * @return field with given name
82- */
83- public Optional <Field > getField (String name ) {
84- return Optional .ofNullable (fields .get (name ));
85- }
86-
87- /**
88- * Returns an unmodifiable map of the fields in this deconstructed object, mapped
89- * by their names.
90- *
91- * @return map of fields
92- */
93- public @ Unmodifiable Map <String , Field > asMap () {
94- return fields ;
75+ DeconstructedObject (List <Field > fields ) {
76+ this .fields = Collections .unmodifiableList (fields );
9577 }
9678
9779 /**
@@ -100,7 +82,7 @@ public Optional<Field> getField(String name) {
10082 * @return list of fields
10183 */
10284 public @ Unmodifiable List <Field > asList () {
103- return List . copyOf ( fields . values ()) ;
85+ return fields ;
10486 }
10587
10688 /**
@@ -111,8 +93,8 @@ public int size() {
11193 }
11294
11395 @ Override
114- public @ NotNull Iterator <Field > iterator () {
115- return fields .values (). iterator ();
96+ public @ NotNull ListIterator <Field > iterator () {
97+ return fields .listIterator ();
11698 }
11799
118100 @ Override
@@ -147,6 +129,13 @@ public sealed interface Field {
147129 */
148130 AnnotatedType annotatedType ();
149131
132+ /**
133+ * @return whether this field is primitive
134+ */
135+ default boolean primitive () {
136+ return type ().isPrimitive ();
137+ }
138+
150139 }
151140
152141 /**
@@ -235,6 +224,7 @@ public Class<?> type() {
235224 public record ObjectField (String name , Class <?> type , AnnotatedType annotatedType , Object value ) implements Field {
236225 }
237226
227+ // TODO this should possibly be in a different class
238228 private static <T > DataHandler <T , DeconstructedObject > createDeconstructor (ClassModel classModel ,
239229 ObjectFactory <T > objectFactory ) {
240230 FieldsExtractor fieldsExtractor = FieldsExtractor .of (classModel );
@@ -245,6 +235,7 @@ private static <T> DataHandler<T, DeconstructedObject> createDeconstructor(Class
245235 };
246236 }
247237
238+ // TODO this should possibly be in a different class
248239 private static <T > DataHandler <DeconstructedObject , T > createConstructor (ClassModel classModel ,
249240 ObjectFactory <T > objectFactory ) {
250241 FieldsInjector fieldsInjector = FieldsInjector .of (classModel );
0 commit comments