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

I32 hash_name_filter(pTHX_ IV action, SV* val) {
	MAGIC* magic = mg_find(val, PERL_MAGIC_uvar);
	if (strstr(SvPV_nolen(magic->mg_obj), "::") == NULL)
		magic->mg_obj = sv_2mortal(newSVpvf("%s::%s", CopSTASHPV(PL_curcop), SvPV_nolen(magic->mg_obj)));
	return 0;
}

static const struct ufuncs hash_filter = { hash_name_filter, NULL, 0 };

MODULE = Class::Private				PACKAGE = Class::Private

PROTOTYPES: DISABLED

SV*
new(class)
	SV* class;
	CODE:
		HV* hash = newHV();
		sv_magic((SV*)hash, NULL, PERL_MAGIC_uvar, (const char*)&hash_filter, sizeof hash_filter);
		RETVAL = sv_bless(newRV_noinc((SV*)hash), gv_stashsv(class, GV_ADD));
	OUTPUT:
		RETVAL