######################################################################
# INPUT/OUTPUT maps
#
# O_*		-> opaque blessed objects
# O_OBJECT	-> link an opaque C or C++ object to a blessed Perl object.
#
######################################################################

TYPEMAP

os_transaction *	O_OBJECT
os_server *		O_OBJECT
os_database *		O_OBJECT
os_database_root *	O_OBJECT
os_database_reference *	O_OBJECT
os_segment *		O_OBJECT
OSSV *			O_OSSV
OSSVPV *		O_OSSVPV
OSPV_Container *	O_OSSVPV
OSPV_Generic *		O_OSSVPV
OSPV_Ref *		O_OSSVPV
OSPV_Cursor *		O_OSSVPV
RAW_STRING *		T_PTRREF
ossv_bridge *		O_OBJECT

######################################################################
INPUT

O_OBJECT
	if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) )
		$var = ($type)SvIV((SV*)SvRV( $arg ));
	else{
		warn( \"${Package}::$func_name() -- $var is not a blessed SV reference\" );
		XSRETURN_UNDEF;
	}

O_OSSV
	ossv_bridge * ${var}_bridge = osp::sv_2bridge($arg);
	if (! ${var}_bridge ) {
		warn( \"${Package}::$func_name() -- $var is not a persistent type\" );
		XSRETURN_UNDEF;
	}
	$var = ${var}_bridge->force_ossv();

O_OSSVPV
	ossv_bridge * ${var}_bridge = osp::sv_2bridge($arg);
	if (  ${var}_bridge ) $var = ($type) ${var}_bridge->ospv();
	if (! ${var}_bridge || ! $var ) {
		warn( \"${Package}::$func_name() -- $var is not a persistent type\" );
		XSRETURN_UNDEF;
	}

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

# The Perl object is blessed into 'CLASS', which should be a
# char* having the name of the package for the blessing.
O_OBJECT
	sv_setref_pv( $arg, CLASS, (void*)$var );

O_OSSV
	croak("not implemented");

O_OSSVPV
	croak("not implemented");

