The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#ifndef __PERLRAYCASTCALLBACK_H__
#define __PERLRAYCASTCALLBACK_H__

#include <Box2D/Box2D.h>
#include <helper.h>

class PerlRayCastCallback : public b2RayCastCallback
{

protected:
	SV* reportFixture;

public:
	PerlRayCastCallback( void* ourSub ) {
		reportFixture = newSVsv( (SV*)ourSub );
	}

	~PerlRayCastCallback(){};

	virtual float32 ReportFixture( b2Fixture *fixture, const b2Vec2 &point, const b2Vec2 &normal, float32 fraction )
	{
		float32 rv;
		int count;

		dSP;

		ENTER;
		SAVETMPS;

		PUSHMARK(SP);
		XPUSHs( sv_2mortal(object_to_stack( sizeof(b2Fixture*), (void*)fixture,            "Box2D::b2Fixture" )) );
		XPUSHs( sv_2mortal(object_to_stack( sizeof(b2Vec2*),    (void*)new b2Vec2(point),  "Box2D::b2Vec2" )) );
		XPUSHs( sv_2mortal(object_to_stack( sizeof(b2Vec2*),    (void*)new b2Vec2(normal), "Box2D::b2Vec2" )) );
		XPUSHs( sv_2mortal(newSVnv(fraction)) );
		PUTBACK;

		count = call_sv( reportFixture, G_SCALAR );

		SPAGAIN;

		if ( count != 1 )
			croak( "ReportFixture callback must return a value" );

		rv = (float32)POPn;

		PUTBACK;
		FREETMPS;
		LEAVE;

		return rv;
	}
};

#endif