I wanted to try experimenting with [fluent interface][1] design in the C programming language. That's why I wanted to ask you, Dear Code Review users, comments on the way I have implement this simple employee record interface. Please note that for maximum simplicity I am resorting to as simple data structures as possible. #include <stdio.h> #include <assert.h> /* if this weren't just an example I'd make a linked list */ #define MAX_EMPLOYEE_COUNT 10 /* global this pointer, there is no way around this */ void* this; typedef struct Employee { struct Employee* (*set_salary)(int); struct Employee* (*set_employee_id)(int); char* name; int salary; int employee_id; } Employee; Employee* do_set_salary(int s) { ((Employee*)this)->salary = s; return this; } Employee* do_set_employee_id(int id) { ((Employee*)this)->employee_id = id; return this; } typedef struct Record { Employee* (*add_employee)(char*); Employee employees[MAX_EMPLOYEE_COUNT]; int cnt; } Record; Employee* do_add_employee(char *n) { Record* this_record = (Record*)this; assert(this_record->cnt < MAX_EMPLOYEE_COUNT); this_record->employees[this_record->cnt].set_salary = do_set_salary; this_record->employees[this_record->cnt].set_employee_id = do_set_employee_id; this_record->employees[this_record->cnt].name = n; this = &this_record->employees[this_record->cnt]; this_record->cnt++; return this; } void init_record(Record* r) { r->cnt = 0; r->add_employee = do_add_employee; } Record* edit(Record* r) { this = r; return r; } void print_record(Record* r) { int i; for (i = 0; i < r->cnt; i++) { printf("%s, salary %d, id %d\n", r->employees[i].name, r->employees[i].salary, r->employees[i].employee_id); } } int main(void) { Record record; init_record(&record); /* behold, fluent interface design! */ edit(&record)-> add_employee("Alice")-> set_salary(1500)-> set_employee_id(10201); edit(&record)-> add_employee("Bob")-> set_salary(2000)-> set_employee_id(10202); print_record(&record); return 0; } [1]: http://en.wikipedia.org/wiki/Fluent_interface