TYPEMAP
Crypt::HSM::Provider	T_MAGICEXT
Crypt::HSM::Slot	T_MAGICEXT
Crypt::HSM::Mechanism	T_MAGICEXT
Crypt::HSM::Session	T_MAGIC
Crypt::HSM::Object	T_MAGIC
Crypt::HSM::Stream	T_MAGIC
Crypt::HSM::Encrypt	T_MAGIC
Crypt::HSM::Decrypt	T_MAGIC
Crypt::HSM::Digest	T_MAGIC
Crypt::HSM::Sign	T_MAGIC
Crypt::HSM::Verify	T_MAGIC
CK_BBOOL	T_BOOL
CK_ULONG	T_U_LONG
CK_SLOT_ID	T_U_LONG
CK_USER_TYPE	T_PACKED
CK_MECHANISM_TYPE	T_PACKED
Attributes	T_PACKED
Session_flags	T_PACKED

INPUT
T_MAGIC
	{
	MAGIC* magic = SvROK($arg) && SvMAGICAL(SvRV($arg)) ? mg_findext(SvRV($arg), PERL_MAGIC_ext, NULL) : NULL;
	if (magic)
		$var = ($type)magic->mg_ptr;
	else
		Perl_croak(aTHX_ \"$ntype object is lacking magic\");
	}

T_MAGICEXT
	{
	MAGIC* magic = SvROK($arg) && SvMAGICAL(SvRV($arg)) ? mg_findext(SvRV($arg), PERL_MAGIC_ext, &${type}_magic) : NULL;
	if (magic)
		$var = ($type)magic->mg_ptr;
	else
		Perl_croak(aTHX_ \"$ntype object is lacking magic\");
	}

T_MAGICEXT_BASE
	{
	MAGIC* magic = SvROK($arg) && SvMAGICAL(SvRV($arg)) ? mg_find(SvRV($arg), PERL_MAGIC_ext) : NULL;
	if (magic && magic->mg_virtual)
		$var = ($type)magic->mg_ptr;
	else
		Perl_croak(aTHX_ \"$ntype object is lacking magic\");
	}


OUTPUT
T_MAGIC
	sv_magicext(newSVrv($arg, "$ntype"), NULL, PERL_MAGIC_ext, NULL, (const char*)$var, 0);
T_MAGICEXT
	{
	MAGIC* magic = sv_magicext(newSVrv($arg, "$ntype"), NULL, PERL_MAGIC_ext, &${type}_magic, (const char*)$var, 0);
	magic->mg_flags |= MGf_COPY|MGf_DUP;
	}

