Object-Pad-ClassAttr-Struct
view release on metacpan or search on metacpan
lib/Object/Pad/ClassAttr/Struct.xs view on Meta::CPAN
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "object_pad.h"
enum {
FLAG_READONLY = (1<<0),
};
static bool struct_apply(pTHX_ ClassMeta *classmeta, SV *value, SV **attrdata_ptr, void *_funcdata)
{
U32 flags = 0;
if(value && SvPOK(value)) {
const char *s = SvPVX(value), *e = s + SvCUR(value);
while(s < e) {
const char *comma_at = strchr(s, ',');
if(!comma_at)
comma_at = e;
lib/Object/Pad/ClassAttr/Struct.xs view on Meta::CPAN
}
}
if(flags)
*attrdata_ptr = newSVuv(flags);
mop_class_apply_attribute(classmeta, "strict", sv_2mortal(newSVpvs("params")));
return TRUE;
}
static void struct_post_add_field(pTHX_ ClassMeta *classmeta, SV *attrdata, void *_funcdata, FieldMeta *fieldmeta)
{
if(mop_field_get_sigil(fieldmeta) != '$')
return;
U32 flags = attrdata ? SvUV(attrdata) : 0;
mop_field_apply_attribute(fieldmeta, "param", NULL);
if(flags & FLAG_READONLY)
mop_field_apply_attribute(fieldmeta, "reader", NULL);
else
mop_field_apply_attribute(fieldmeta, "mutator", NULL);
}
static void struct_post_seal(pTHX_ ClassMeta *classmeta, SV *attrdata, void *_funcdata)
{
dSP;
ENTER;
SAVETMPS;
EXTEND(SP, 1);
PUSHMARK(SP);
PUSHs(mop_class_get_name(classmeta));
PUTBACK;
( run in 0.346 second using v1.01-cache-2.11-cpan-454fe037f31 )