# those can also be T_CPTROBJ and then automatically use REF on DESTROY
# needed are only T_AVREF and T_CARRAY
int *     T_CPTR
int2 *    T_CPTR
int3 *    T_CPTR
int4 *    T_CPTR
double *  T_CPTR
double2 * T_CPTR
double3 * T_CPTR
char **   T_CSTRINGPTR
AV *	  T_AVREF
CARRAY_T * 	T_CARRAY
CINTARRAY_T * 	T_CARRAY
CDOUBLEARRAY_T * 	T_CARRAY
CSTRINGARRAY_T * 	T_CARRAY

#############################################################################
INPUT
T_CARRAY
	g_classname = mysv_classname($arg);
        if (sv_derived_from($arg, \"${my $ntt=$ntype; $ntype eq 'CARRAY_TPtr' ? $ntt='CArray' : $ntt=~s/C(.)(.*)ARRAY_TPtr/C.$1.lc($2).'Array'/e;\$ntt}\")) {
                IV tmp = SvIV((SV*)SvRV($arg));
		$var = ($type) tmp;
	} else {
                croak(\"$var is not of type ${(my $ntt=$ntype)=~s/C(.?)(.*)ARRAY_TPtr/C.$1.lc($2).'Array'/e;\$ntt}\");
	}
T_CPTR
        if (sv_derived_from($arg, \"${(my $ntt=$ntype)=~s/(.)(.*)Ptr/'C'.uc($1).$2.'Array'/e;\$ntt}\")) {
		IV tmp = SvIV((SV*)SvRV($arg));
		$var = ($type) tmp;
	} else {
                croak(\"$var is not of type ${(my $ntt=$ntype)=~s/(.)(.*)Ptr/'C'.uc($1).$2.'Array'/e;\$ntt}\");
	}
T_AVREF
        if (SvROK($arg)) $var = (AV*)SvRV($arg);
	else croak(\"$var is no ARRAYREF\");
#############################################################################
OUTPUT
T_CARRAY
        sv_setref_pv($arg, g_classname, (void*)$var);
T_CPTR
        sv_setref_pv($arg, \"${(my $ntt=$ntype)=~s/(.)(.*)Ptr/'C'.uc($1).$2.'Array'/e;\$ntt}\", (void*)$var);
T_CSTRINGPTR
        sv_setref_pv($arg, \"CStringArray\", (void*)$var);