+/* Some terminology used in function names:
+ * - initialize: These functions take a pointer and potentially some other arguments, and use those
+ * to initialize the value pointed to by self. Initialize functions DO NOT allocate the function,
+ * so they can be used to initialize stack-allocated variables.
+ * - construct: This allocates a value for a pointer, initializes it, and returns it. This is for
+ * heap-allocated values. It may be as simple as allocating the memory, calling an initialize, and
+ * returning it.
+ * - deinitialize: These functions dereference or free any objects pointed to by the self pointer's
+ * value, but they don't actually free the self pointer. This is useful for stack-allocated objects
+ * which point to heap-allocated objects.
+ * - destruct: This dereferences or frees memory pointed to by the self argument, and all the
+ * pointers on the self argument.
+ */
+