The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# In bizarre behavior, DESTROY methods are treated specially
# with s/OBJ$/REF/. We call MICOOBJ MICOOB to prevent this.

TYPEMAP
CORBA::Object	            T_OBJREF
CORBA::Any	            T_PTROBJ
CORBA::ORB	            T_PTROBJ
CORBA::TypeCode	            T_PTROBJ
CORBA::Dispatcher           T_PTROBJ
CORBA::DispatcherCallback   T_PTROBJ

CORBA::LongLong             T_LONGLONG
CORBA::ULongLong            T_ULONGLONG
CORBA::LongDouble           T_LONGDOUBLE

PortableServer::POA *        T_MICOOB
PortableServer::POAManager * T_MICOOB
PortableServer::Current *    T_MICOOB
PortableServer::ServantBase  T_SERVANT
PortableServer::ObjectId     T_OBJECTID

CORBA::MICO::GtkDispatcher    T_PTROBJ
CORBA::MICO::ServerlessObject T_PTROBJ

######################################################################
INPUT
T_SERVANT
	$var = pmico_sv_to_servant ($arg)
T_OBJREF
	$var = pmico_sv_to_objref ($arg)
T_MICOOB
	if (sv_derived_from($arg, \"${subtype}\")) {
	    IV tmp = SvIV((SV*)SvRV($arg));
	    $var = ($type) tmp;
	}
	else
	    croak(\"$var is not of type ${subtype}\")
T_OBJECTID
	{
		STRLEN len;
		char *str;
		str = SvPV($arg, len);
		$var = new PortableServer::ObjectId (len);
		$var->length(len);
		for (STRLEN i = 0 ; i < len ; i++) {
		    $var\[i] = str[i];
		}	
	}
T_LONGLONG
        $var = SvLLV ($arg)
T_ULONGLONG
        $var = SvULLV ($arg)
T_LONGDOUBLE
        $var = SvLDV ($arg)

######################################################################
OUTPUT

T_SERVANT
	$arg = pmico_servant_to_sv ($var);
T_OBJREF
	$arg = pmico_objref_to_sv ($var);
T_MICOOB
	sv_setref_pv($arg, \"${subtype}\", (void*)$var);
T_OBJECTID
	{
		sv_setpv($arg, "");
		SvGROW($arg, $var->length()+1);
		SvCUR_set($arg, $var->length());
		char *pv = SvPVX ($arg);
		
		for (unsigned int i = 0 ; i < $var->length() ; i++) {
		    pv[i] = $var\[i];
		}	
		pv[$var->length()] = '\\0';
	}
T_LONGLONG
	$arg = ll_from_longlong ($var);
T_ULONGLONG
	$arg = ull_from_ulonglong ($var);
T_LONGDOUBLE
	$arg = ld_from_longdouble ($var);