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 )