#define PERL_NO_GET_CONTEXT #include "EXTERN.h" #include "perl.h" #include "XSUB.h" static cv_flags_t get_flag(const char *attr) 8 { 8 if (strnEQ(attr, "method", 6)) 3 return CVf_METHOD; 5 else if (strnEQ(attr, "locked", 6)) 5 return CVf_LOCKED; else ###### return 0; } MODULE = attrs PACKAGE = attrs void import(...) ALIAS: unimport = 1 PREINIT: 6 int i; PPCODE: 6 if (items < 1) ###### Perl_croak(aTHX_ "Usage: %s(Class, ...)", GvNAME(CvGV(cv))); 6 if (!PL_compcv || !(cv = CvOUTSIDE(PL_compcv))) ###### croak("can't set attributes outside a subroutine scope"); 6 if (ckWARN(WARN_DEPRECATED)) 1 Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), "pragma \"attrs\" is deprecated, " "use \"sub NAME : ATTRS\" instead"); 14 for (i = 1; i < items; i++) { 8 const char * const attr = SvPV_nolen(ST(i)); 8 const cv_flags_t flag = get_flag(attr); 8 if (!flag) ###### croak("invalid attribute name %s", attr); 8 if (ix) ###### CvFLAGS(cv) &= ~flag; else 8 CvFLAGS(cv) |= flag; } void get(sub) SV * sub PPCODE: 3 if (SvROK(sub)) { 3 sub = SvRV(sub); 3 if (SvTYPE(sub) != SVt_PVCV) ###### sub = Nullsv; } else { ###### const char * const name = SvPV_nolen(sub); ###### sub = (SV*)perl_get_cv(name, FALSE); } 3 if (!sub) ###### croak("invalid subroutine reference or name"); 3 if (CvFLAGS(sub) & CVf_METHOD) 3 XPUSHs(sv_2mortal(newSVpvn("method", 6))); 3 if (CvFLAGS(sub) & CVf_LOCKED) 2 XPUSHs(sv_2mortal(newSVpvn("locked", 6)));