4 #define GLOB_CREATE 0x01
5 #define VARIABLE_CREATE 0x02
9 mop_deconstruct_variable_name(pTHX_ SV* const variable, svtype* const type, const char** const type_name, I32* const flags) {
12 if(SvROK(variable) && SvTYPE(SvRV(variable)) == SVt_PVHV){
13 /* e.g. variable = { type => "SCALAR", name => "foo" } */
14 HV* const hv = (HV*)SvRV(variable);
19 svp = hv_fetchs(hv, "name", FALSE);
20 if(!(svp && SvOK(*svp))){
21 croak("You must pass a variable name");
23 name = SvPV_const(*svp, len);
25 croak("You must pass a variable name");
28 svp = hv_fetchs(hv, "type", FALSE);
29 if(!(svp && SvOK(*svp))) {
30 croak("You must pass a variable type");
32 pv = SvPV_nolen_const(*svp);
33 if(strEQ(pv, "SCALAR")){
34 *type = SVt_PV; /* for all the type of scalars */
36 else if(strEQ(pv, "ARRAY")){
39 else if(strEQ(pv, "HASH")){
42 else if(strEQ(pv, "CODE")){
45 else if(strEQ(pv, "GLOB")){
48 else if(strEQ(pv, "IO")){
52 croak("I do not recognize that type '%s'", pv);
56 svp = hv_fetchs(hv, "create", FALSE);
57 if(svp && SvTRUE(*svp)){
58 *flags = VARIABLE_CREATE | GLOB_CREATE;
64 /* e.g. variable = '$foo' */
66 croak("You must pass a variable name");
68 pv = SvPV_const(variable, len);
70 croak("You must pass a variable name including a sigil");
75 *type = SVt_PV; /* for all the types of scalars */
76 *type_name = "SCALAR";
95 croak("I do not recognize that sigil '%c'", pv[0]);
104 MODULE = Class::MOP::Package PACKAGE = Class::MOP::Package
109 get_all_package_symbols(self, filter=TYPE_FILTER_NONE)
117 if ( ! SvROK(self) ) {
118 die("Cannot call get_all_package_symbols as a class method");
121 if (GIMME_V == G_VOID) {
127 if ( (he = hv_fetch_ent((HV *)SvRV(self), KEY_FOR(package), 0, HASH_FOR(package))) ) {
128 stash = gv_stashsv(HeVAL(he), 0);
136 symbols = mop_get_all_package_symbols(stash, filter);
137 PUSHs(sv_2mortal(newRV_noinc((SV *)symbols)));
140 INSTALL_SIMPLE_READER_WITH_KEY(Package, name, package);
142 #define S_HAS GV_NOADD_NOINIT
144 #define S_ADD GV_ADDMULTI
147 add_package_symbol(SV* self, SV* variable, SV* ref = &PL_sv_undef)
149 has_package_symbol = S_HAS
150 get_package_symbol = S_GET
151 add_package_symbol = S_ADD
154 const char* type_name;
155 const char* var_name;
158 I32 flags = 0; /* not used */
160 var_name = mop_deconstruct_variable_name(aTHX_ variable, &type, &type_name, &flags);
162 package_name = mop_call0(aTHX_ self, KEY_FOR(name));
163 if(!SvOK(package_name)){
164 croak("name() did not return a defined value");
166 fq_name = Perl_form(aTHX_ "%"SVf"::%s", package_name, var_name);
168 if(items == 3 && ix != S_ADD){
169 croak("Too many arguments for %s", GvNAME(CvGV(cv)));
172 if(SvOK(ref)){ /* add_package_symbol with a value */
177 ref = newRV_noinc(newSVsv(ref));
181 else if(!(SvROK(ref) && SvTYPE(SvRV(ref)) == type)){
182 croak("You must pass a reference of %s for the value of %s", type_name, GvNAME(CvGV(cv)));
184 gv = gv_fetchpv(fq_name, GV_ADDMULTI, type);
186 if(type == SVt_PVCV && GvCV(gv)){
187 /* XXX: should introduce an option { redefine => 1 } ? */
188 SvREFCNT_dec(GvCV(gv));
191 sv_setsv_mg((SV*)gv, ref); /* *glob = $ref */
194 else { /* no values */
195 GV* const gv = gv_fetchpv(fq_name, ix | (flags & GLOB_CREATE ? GV_ADDMULTI : 0), type);
207 if(!isGV(gv)){ /* In has_package_symbol, the stash entry is a stub or constant */
209 if(type == SVt_PVCV){
219 sv = (SV*)((flags & VARIABLE_CREATE) ? GvAVn(gv) : GvAV(gv));
222 sv = (SV*)((flags & VARIABLE_CREATE) ? GvHVn(gv) : GvHV(gv));
228 sv = (SV*)((flags & VARIABLE_CREATE) ? GvIOn(gv) : GvIO(gv));
233 default: /* SCALAR */
234 sv = (flags & VARIABLE_CREATE) ? GvSVn(gv) : GvSV(gv);
243 RETVAL = sv_2mortal(newRV_inc(sv));
246 RETVAL = &PL_sv_undef;