-/* too non-C: #define I_must_be(TYPE) TYPE self, void *_method * */
-#define member_of(TYPE) TYPE _we
-#define anonymous void *_we
-#define I_am(TYPE) TYPE self=(TYPE)_we
-#define def_community(METATYPE,ITYPE) def_mem(METATYPE) { ITYPE __interface; };
-#define def_method(RET,NAME,...) RET (*NAME)(__VA_ARGS__)
-#define construct_interface(MTYPE,ITYPE) ITYPE _init,_##MTYPE##ITYPE(void *dummy, ...) { new_mem(_FACE,ITYPE); va_list(ap); _##MTYPE##ITYPE##_init(_FACE); return _FACE; } void _##MTYPE##ITYPE##_init(IFACE _FACE)
-#define bind_method(METHOD,FUNCTION) _FACE->METHOD=FUNCTION
-#define new_interface(ID,MTYPE,...) _ARG1(__VA_ARGS__,) ID=_init_##MTYPE##_ARG1(__VA_ARGS__,) ((void *)init_##MTYPE##__VA_ARGS__,)
-#define init_interface(TYPE,...)
-#define construct_object(MTYPE,...) (void *)_init_##TYPE##_()
-#define init_object(TYPE,...) (TYPE)_init_##TYPE##_(__VA_ARGS__)
-#define init_polymorph(TYPE,COMMUNITY,...) (COMMUNITY)_init_##TYPE##_(__VA_ARGS__)
+#define def_type(TYPE) typedef struct _##TYPE##_t * TYPE;
+#define def_obj(TYPE) struct _##TYPE##_t
+#define method(NAME) (*NAME)
+#define construct(TYPE) _init_##TYPE(TYPE o,void *i) { o->__interface=i; return o; } TYPE __init__##TYPE
+#define get_obj(TYPE,INTERFACE,...) __init__##TYPE(_init_##TYPE(get_mem(TYPE),INTERFACE),__VA_ARGS__)
+#define Get_obj(ID,MEM,INTERFACE) MEM ID=get_obj(MEM,INTERFACE)
+#define get_obj_as(COMMUNITY,MEM,INTERFACE) (COMMUNITY)get_obj(MEM,INTERFACE)
+#define Get_obj_as(ID,COMMUNITY,MEM,INTERFACE) MEM ID=get_obj_as(COMMUNITY,MEM,INTERFACE)