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 0.717 second using v1.01-cache-2.11-cpan-5511b514fd6 )