+#include <cll1h>
+
+def_community(Drawable_object,Actions);
+
+def_mem(Actions)
+{
+ void method(init) (Drawable_object self, ...);
+ void method(draw) (Drawable_object self);
+ int method(desc) (Drawable_object self,int something);
+};
+
+def_mem(Tri)
+{
+ interface(Actions);
+ int x1, y1, x2, y2, x3, y3;
+};
+
+def_mem(Rect)
+{
+ interface(Actions);
+ int x1, y1, x2, y2;
+};
+
+construct_obj(Tri,Actions);
+
+construct_obj(Rect,Actions);
+
+
+def_mem(Object_list)
+{
+ Drawable_object object;
+ list(Object_list);
+};
+
+Actions init_tri_interface(Actions this)
+{
+ this->init = init_tri;
+ this->draw = draw_tri;
+ this->desc = desc_tri;
+
+ return this;
+}
+
+Actions init_rect_interface(Actions this)
+{
+ this->init = init_tri;
+ this->draw = draw_rect;
+ this->desc = desc_rect;
+
+ return this;
+}
+
+void draw_tri(Drawable_object community)
+{
+ I_am(Tri);
+
+ printf("imagine I am drawing %d,%d - %d,%d - %d,%d\n",
+ self->x1,self->y1,self->x2,self->y2,self->x3,self->y3);
+};
+
+void draw_rect(Drawable_object community)
+{
+ I_am(Rect);
+
+ printf("imagine I am drawing %d,%d - %d,%d\n",
+ self->x1,self->y1,self->x2,self->y2);
+};
+
+int desc_tri(Drawable_object community,int something)
+{
+ I_am(Tri);
+
+ printf("I am triangle %d,%d - %d,%d - %d,%d, method draw called with argument: %d\n",
+ self->x1,self->y1,self->x2,self->y2,self->x3,self->y3,something);
+
+ return something;
+};
+
+int desc_rect(Drawable_object community,int something)
+{
+ I_am(Rect);
+
+ printf("I am rectangle %d,%d - %d,%d, method draw called with argument: %d\n",
+ self->x1,self->y1,self->x2,self->y2,something);
+
+ return something;
+};
+
+Tri init_tri(Drawable_object self, int x1, int y1, int x2, int y2, int x3, int y3)
+{
+ I_am(Tri);
+
+ self->x1 = x1;
+ self->y1 = y1;
+ self->x2 = x2;
+ self->y2 = y2;
+ self->x3 = x3;
+ self->y3 = y3;
+
+ return self;
+}
+
+Rect init_rect(Drawable_object self, int x1, int y1, int x2, int y2)
+{
+ I_am(Rect);
+
+ self->x1 = x1;
+ self->y1 = y1;
+ self->x2 = x2;
+ self->y2 = y2;
+
+ return self;
+}
+
+program
+{
+ Init_mem(tri_interface,Actions,init_tri_interface);
+ Init_mem(rect_interface,Actions,init_rect_interface);
+ Object_list all = NULL, one = get_mem(Object_list);
+
+ one->object = init_obj_as(Drawable_data, Rect, rect_interface, 0, 10, 1, 11);
+ append(one,all);
+ one->object = init_obj_as(Drawable_data, Tri, tri_interface, 0, 0, 0, 4, 3, 0);
+ append(one,all);
+ one->object = init_obj_as(Drawable_data, Rect, rect_interface, 10, 0, 11, 1);
+ append(one,all);
+
+ for_each(one,all)
+ {
+ printf("(return value %d)\n", _(one->object,desc));
+ _(one->object,draw);
+ }
+}