#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "PerlBonoboInt.h" #include "GtkDefs.h" #include "BonoboDefs.h" #include "MiscTypes.h" static BonoboObject * factory_handler(BonoboGenericFactory *Factory, void *data) { AV * stuff; SV * handler; SV * result; BonoboObject * obj; int i; dSP; stuff = (AV*)data; handler = *av_fetch(stuff, 0, 0); ENTER; SAVETMPS; PUSHMARK(SP); for (i=1;i<=av_len(stuff);i++) XPUSHs(sv_2mortal(newSVsv(*av_fetch(stuff, i, 0)))); PUTBACK; i = perl_call_sv(handler, G_SCALAR); SPAGAIN; if (i!=1) croak("handler failed"); result = POPs; obj = SvGtkObjectRef(result, "Gnome::BonoboObject"); PUTBACK; FREETMPS; LEAVE; return obj; } MODULE = Gnome::BonoboGenericFactory PACKAGE = Gnome::BonoboGenericFactory PREFIX = bonobo_generic_factory_ #ifdef BONOBO_GENERIC_FACTORY Gnome::BonoboGenericFactory bonobo_generic_factory_new (Class, goad_id, handler, ...) SV * Class char * goad_id SV * handler CODE: { AV *args; args = newAV(); PackCallbackST(args, 2); RETVAL = bonobo_generic_factory_new (goad_id, factory_handler, args); } OUTPUT: RETVAL #endif