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

/* There must be a function to do this already? */
void
amd_require(const char *package)
{
	char	 buf[512];
	char	*rp;
	char	*wp;
	SV		*sv;

	/* Leave space for ".pm" */
	strncpy(buf, package, 509);
	buf[509] = '\0';

	rp = buf;
	wp = buf;
	while (*rp) {
		if (*rp == ':' && *(rp + 1) == ':') {
			*wp++ = '/';
			rp++;
			if (!*rp)
				break;
			rp++;
		}
		else {
			*wp++ = *rp++;
		}
	}
	*wp = '\0';
	strcat(buf, ".pm");

	require_pv(buf);

	sv = get_sv("@", FALSE);
	if (SvTRUE(sv)) {
		croak("Compilation failed in amd_require(%s):\n%s",
						package,
						SvPV_nolen(sv));
	}
}

void
amd_dump(const char *prefix, SV *sv)
{
	dSP;
	int	 count;

	amd_require("Data::Dumper");

	ENTER;
	SAVETMPS;
	PUSHMARK(SP);
	XPUSHs(sv);
	PUTBACK;
	count = call_pv("Data::Dumper::Dumper", G_SCALAR);
	SPAGAIN;
	if (count != 1)
		croak("Didn't get a return value from Dumper\n");
	printf("%s: %s\n", prefix, POPp);
	fflush(stdout);
	PUTBACK;
	FREETMPS;
	LEAVE;
}

void
amd_peek(const char *prefix, SV *sv)
{
	dSP;
	int	 count;

	amd_require("Devel::Peek");

	printf("Peeking at %s\n", prefix);
	fflush(stdout);

	ENTER;
	SAVETMPS;
	PUSHMARK(SP);
	XPUSHs(sv);
	PUTBACK;
	count = call_pv("Devel::Peek::Dump", G_DISCARD);
	FREETMPS;
	LEAVE;
}