CFCPerlConstructor* CFCPerlConstructor_init(CFCPerlConstructor *self, CFCClass *klass, const char *alias, const char *initializer) { CFCUTIL_NULL_CHECK(alias); CFCUTIL_NULL_CHECK(klass); const char *class_name = CFCClass_get_class_name(klass); initializer = initializer ? initializer : "init"; // Find the implementing function. self->init_func = NULL; CFCFunction **funcs = CFCClass_functions(klass); for (size_t i = 0; funcs[i] != NULL; i++) { CFCFunction *func = funcs[i]; const char *func_name = CFCFunction_micro_sym(func); if (strcmp(initializer, func_name) == 0) { self->init_func = (CFCFunction*)CFCBase_incref((CFCBase*)func); break; } } if (!self->init_func) { CFCUtil_die("Missing or invalid '%s' function for '%s'", initializer, class_name); } CFCParamList *param_list = CFCFunction_get_param_list(self->init_func); CFCPerlSub_init((CFCPerlSub*)self, param_list, class_name, alias, true); return self; }
CFCPerlMethod* CFCPerlMethod_init(CFCPerlMethod *self, CFCMethod *method, const char *alias) { CFCParamList *param_list = CFCMethod_get_param_list(method); const char *class_name = CFCMethod_get_class_name(method); int use_labeled_params = CFCParamList_num_vars(param_list) > 2 ? 1 : 0; // The Clownfish destructor needs to be spelled DESTROY for Perl. if (!alias) { alias = CFCMethod_micro_sym(method); } static const char destroy_uppercase[] = "DESTROY"; if (strcmp(alias, "destroy") == 0) { alias = destroy_uppercase; } CFCPerlSub_init((CFCPerlSub*)self, param_list, class_name, alias, use_labeled_params); self->method = (CFCMethod*)CFCBase_incref((CFCBase*)method); return self; }