Object-Pad

 view release on metacpan or  search on metacpan

lib/Object/Pad.xs  view on Meta::CPAN

    if(!gvp)
      croak("Unable to find ClassMeta for %" HEKf, HEKfARG(HvNAME_HEK(stash)));

    RETVAL = newSVsv(GvSV(*gvp));
  }
  OUTPUT:
    RETVAL

void
deconstruct_object(SV *obj)
  PPCODE:
  {
    if(!SvROK(obj) || !SvOBJECT(SvRV(obj)))
      croak("Expected an object reference to deconstruct_object");

    ClassMeta *classmeta = mop_get_class_for_stash(SvSTASH(SvRV(obj)));

    SV *fieldstore = get_obj_fieldstore(obj, classmeta->repr, true);

    U32 retcount = 0;

lib/Object/mop-class.xsi  view on Meta::CPAN


SV *
name(ClassMeta *self)
  CODE:
    RETVAL = SvREFCNT_inc(self->name);
  OUTPUT:
    RETVAL

void
superclasses(ClassMeta *self)
  PPCODE:
    if(self->type == METATYPE_CLASS && self->cls.supermeta) {
      PUSHs(sv_newmortal());
      sv_setref_uv(ST(0), "Object::Pad::MOP::Class", PTR2UV(self->cls.supermeta));
      XSRETURN(1);
    }

    XSRETURN(0);

void
direct_roles(ClassMeta *self)
  ALIAS:
    direct_roles = 0
    all_roles    = 1
  PPCODE:
  {
    U32 count = 0;

    /* TODO Consider recursion */
    U32 i;
    switch(self->type) {
      case METATYPE_CLASS: {
        U32 nroles;
        RoleEmbedding **embeddings = NULL;
        switch(ix) {

lib/Object/mop-class.xsi  view on Meta::CPAN

    sv_setref_uv(RETVAL, "Object::Pad::MOP::Method", PTR2UV(methodmeta));
  }
  OUTPUT:
    RETVAL

void
get_direct_method(ClassMeta *self, methodname)
    SV *methodname
  ALIAS:
    get_method = 1
  PPCODE:
  {
    bool recurse = !!ix;
    ClassMeta *class = self;

    do {
      AV *methods = class->direct_methods;
      U32 nmethods = av_count(methods);

      U32 i;
      for(i = 0; i < nmethods; i++) {

lib/Object/mop-class.xsi  view on Meta::CPAN

    } while(recurse && class);

    croak("Class %" SVf " does not have a method called '%" SVf "'",
      SVfARG(self->name), SVfARG(methodname));
  }

void
direct_methods(ClassMeta *self)
  ALIAS:
    all_methods = 1
  PPCODE:
    bool recurse = !!ix;

    /* A hash to remove overrides */
    HV *mnames = NULL;
    if(recurse) {
      mnames = newHV();
      SAVEFREESV(mnames);
    }

    U32 retcount = 0;

lib/Object/mop-class.xsi  view on Meta::CPAN


    RETVAL = newSV(0);
    sv_setref_uv(RETVAL, "Object::Pad::MOP::Field", PTR2UV(fieldmeta));
  }
  OUTPUT:
    RETVAL

void
get_field(ClassMeta *self, fieldname)
    SV *fieldname
  PPCODE:
  {
    FieldMeta *fieldmeta = mop_class_find_field(self, fieldname, FIND_FIELD_ONLY_DIRECT);
    if(fieldmeta) {
      ST(0) = sv_newmortal();
      sv_setref_iv(ST(0), "Object::Pad::MOP::Field", PTR2UV(fieldmeta));
      XSRETURN(1);
    }

    croak("Class %" SVf " does not have a field called '%" SVf "'",
      self->name, fieldname);
  }

void
fields(ClassMeta *self)
  PPCODE:
    AV *fields = self->fields;
    U32 nfields = av_count(fields);

    EXTEND(SP, nfields);

    U32 retcount = 0;
    FIELDOFFSET i;
    for(i = 0; i < nfields; i++) {
      FieldMeta *fieldmeta = (FieldMeta *)AvARRAY(fields)[i];
      if(!fieldmeta->is_direct)
        continue;

      ST(i) = sv_newmortal();
      sv_setref_iv(ST(i), "Object::Pad::MOP::Field", PTR2UV(fieldmeta));
      retcount++;
    }
    XSRETURN(retcount);

void
required_method_names(ClassMeta *self)
  PPCODE:
    if(self->type != METATYPE_ROLE)
      croak("Can only call ->required_method_names on a metaclass for a role");

    AV *required_methods = self->requiremethods;
    U32 nmethods = av_count(required_methods);

    EXTEND(SP, nmethods);

    int i;
    for(i = 0; i < nmethods; i++) {

lib/Object/mop-field.xsi  view on Meta::CPAN

        break;

      default: RETVAL = NULL;
    }
  OUTPUT:
    RETVAL

void
value(FieldMeta *self, obj)
    SV *obj
  PPCODE:
  {
    SV *objrv;

    if(!SvROK(obj) || !SvOBJECT(objrv = SvRV(obj)))
      croak("Cannot fetch field value of a non-instance");

    SV *value = get_obj_fieldsv(obj, self);

    /* We must prevent caller from assigning to non-scalar fields, in case
     * they break the SvTYPE of the value. We can't cancel the CvLVALUE but we

lib/Object/mop-field.xsi  view on Meta::CPAN

      croak("Field does not have an attribute called %" SVf, SVfARG(name));

    RETVAL = newSVsv(hook->attrdata);
  }
  OUTPUT:
    RETVAL

void
get_attribute_values(FieldMeta *self, name)
    SV *name
  PPCODE:
  {
    AV *values = mop_field_get_attribute_values(self, SvPV_nolen(name));
    if(!values)
      croak("Field does not have an attribute called %" SVf, SVfARG(name));

    Size_t count = av_count(values);

    EXTEND(SP, count);
    for(Size_t i = 0; i < count; i++)
      PUSHs(SvREFCNT_inc(AvARRAY(values)[i]));



( run in 2.151 seconds using v1.01-cache-2.11-cpan-5511b514fd6 )