ffi_pl_string     T_FFI_PL_STRING
ffi_pl_type*      T_FFI_PL_TYPE
ffi_pl_function*  T_FFI_PL_FUNCTION
ffi_pl_closure*   T_FFI_PL_CLOSURE_DATA
ffi_pl_arguments* T_FFI_PL_ARGUMENTS

OUTPUT
T_FFI_PL_STRING
  $var != NULL ? sv_setpv((SV*)$arg, $var) : sv_setsv((SV*)$arg, &PL_sv_undef);

T_FFI_PL_TYPE
  sv_setref_pv($arg, \"FFI::Platypus::Type\", (void *) $var);

T_FFI_PL_FUNCTION
  sv_setref_pv($arg, \"FFI::Platypus::Function::Function\", (void *) $var);

T_FFI_PL_CLOSURE_DATA
  sv_setref_pv($arg, \"FFI::Platypus::ClosureData\", (void *) $var);

INPUT
T_FFI_PL_STRING
  $var = SvOK($arg) ? ($type)SvPV_nolen($arg) : NULL;

T_FFI_PL_TYPE
  if(sv_isobject($arg) && sv_derived_from($arg, \"FFI::Platypus::Type\"))
    $var = INT2PTR($type, SvIV((SV *) SvRV($arg)));
  else
    Perl_croak(aTHX_ \"$var is not of type FFI::Platypus::Type\");

T_FFI_PL_FUNCTION
  if(sv_isobject($arg) && sv_derived_from($arg, \"FFI::Platypus::Function::Function\"))
    $var = INT2PTR($type, SvIV((SV *) SvRV($arg)));
  else
    Perl_croak(aTHX_ \"$var is not of type FFI::Platypus::Function::Function\");

T_FFI_PL_CLOSURE_DATA
  if(sv_isobject($arg) && sv_derived_from($arg, \"FFI::Platypus::ClosureData\"))
    $var = INT2PTR($type, SvIV((SV *) SvRV($arg)));
  else
    Perl_croak(aTHX_ \"$var is not of type FFI::Platypus::ClosureData\");

T_FFI_PL_ARGUMENTS
  if(sv_isobject($arg) && sv_derived_from($arg, \"FFI::Platypus::API::ARGV\"))
    $var = INT2PTR($type, SvIV((SV *) SvRV($arg)));
  else
    Perl_croak(aTHX_ \"$var is not of type FFI::Platypus::API::ARGV\");