The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

typedef SV MyOpaqueObject;

MODULE = Store::Opaque		PACKAGE = Store::Opaque		


MyOpaqueObject*
new(CLASS)
    char *CLASS
  CODE:
    RETVAL = (SV*)newHV();
  OUTPUT:
    RETVAL

SV*
_get(self, key)
    MyOpaqueObject* self
    SV* key
  PREINIT:
    HE* entry;
  CODE:
    entry = hv_fetch_ent((HV*)self, key, 0, 0);
    if (entry != NULL)
      RETVAL = newSVsv( HeVAL(entry) );
    else
      RETVAL = &PL_sv_undef;
  OUTPUT: RETVAL

void
_set(self, key, value)
    MyOpaqueObject* self
    SV* key
    SV* value
  CODE:
    hv_store_ent((HV*)self, key, newSVsv(value), 0);


void
DESTROY(self)
    MyOpaqueObject* self
  CODE:
    SvREFCNT_dec((HV*)self);