diff --git a/include/class/interface/class.h b/include/class/interface/class.h index 98cbdbd..721af7b 100644 --- a/include/class/interface/class.h +++ b/include/class/interface/class.h @@ -52,6 +52,13 @@ extern void * classClone(void *); #define delete(object) classDelete((void **)&(object)) #define clone(object) classClone((void *)(object)) +/** + * With this one we can create a new instance via a + * intermidiary that gets the arguments. + */ +extern void * classNewParams(class_ptr, va_list *); +#define newParams(class,args) classNewParams(_##class, args) + #endif // __CLASS_INTERFACE_CLASS_H__ // vim: set ts=4 sw=4: diff --git a/src/class/interface/i_class.c b/src/class/interface/i_class.c index 196363d..25b1608 100644 --- a/src/class/interface/i_class.c +++ b/src/class/interface/i_class.c @@ -37,18 +37,15 @@ struct interface i_Class = { }; void * -classNew(class_ptr class, ...) +classNewParams(class_ptr class, va_list * params) { void * object = memCalloc(1, class->object_size + sizeof(void*)); - va_list params; int ret; * (class_ptr *)object = class; object += sizeof(void*); - va_start(params, class); - RETCALL(object, Class, ctor, ret, ¶ms); - va_end(params); + RETCALL(object, Class, ctor, ret, params); if (-1 == ret) { classDelete(&object); @@ -57,6 +54,19 @@ classNew(class_ptr class, ...) return object; } +void * +classNew(class_ptr class, ...) +{ + va_list params; + void * object; + + va_start(params, class); + object = classNewParams(class, ¶ms); + va_end(params); + + return object; +} + void classDelete(void ** object) {