#define PERL_NO_GET_CONTEXT 1
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#define PERL_VERSION_DECIMAL(r,v,s) (r*1000000 + v*1000 + s)
#define PERL_DECIMAL_VERSION \
	PERL_VERSION_DECIMAL(PERL_REVISION,PERL_VERSION,PERL_SUBVERSION)
#define PERL_VERSION_GE(r,v,s) \
	(PERL_DECIMAL_VERSION >= PERL_VERSION_DECIMAL(r,v,s))

static bool svt_scalar(svtype t)
{
	switch(t) {
		case SVt_NULL: case SVt_IV: case SVt_NV:
#if !PERL_VERSION_GE(5,11,0)
		case SVt_RV:
#endif /* <5.11.0 */
		case SVt_PV: case SVt_PVIV: case SVt_PVNV:
		case SVt_PVMG: case SVt_PVLV: case SVt_PVGV:
#if PERL_VERSION_GE(5,11,0)
		case SVt_REGEXP:
#endif /* >=5.11.0 */
			return 1;
		default:
			return 0;
	}
}

MODULE = Scalar::Construct PACKAGE = Scalar::Construct

PROTOTYPES: DISABLE

SV *
constant(SV *value)
PROTOTYPE: $
PREINIT:
	SV *obj;
CODE:
	obj = newSVsv(value);
	SvREADONLY_on(obj);
	RETVAL = newRV_noinc(obj);
OUTPUT:
	RETVAL

SV *
variable(SV *value)
PROTOTYPE: $
CODE:
	RETVAL = newRV_noinc(newSVsv(value));
OUTPUT:
	RETVAL

SV *
aliasref(SV *object_ref)
PROTOTYPE: $
PREINIT:
	SV *object;
CODE:
	if(!(SvROK(object_ref) && (object = SvRV(object_ref), 1) &&
			svt_scalar(SvTYPE(object))))
		croak("not a scalar reference");
	RETVAL = newRV_inc(object);
OUTPUT:
	RETVAL

SV *
aliasobj(SV *object)
PROTOTYPE: $
CODE:
	RETVAL = newRV_inc(object);
OUTPUT:
	RETVAL