va_list args;
SV* message;
- PERL_UNUSED_ARG(data); /* for moose-compat */
-
assert(metaobject);
assert(fmt);
{
dSP;
PUSHMARK(SP);
- EXTEND(SP, 4);
+ EXTEND(SP, 6);
PUSHs(metaobject);
mPUSHs(message);
- mPUSHs(newSVpvs("depth"));
- mPUSHi(-1);
+ if(data){ /* extra arg, might be useful for debugging */
+ mPUSHs(newSVpvs("data"));
+ PUSHs(data);
+ mPUSHs(newSVpvs("depth"));
+ mPUSHi(-1);
+ }
PUTBACK;
int
mouse_predicate_call(pTHX_ SV* const self, SV* const method) {
- SV* const value = mcall0(self, method);
- return SvTRUE(value);
+ return sv_true( mcall0(self, method) );
}
SV*
}
bool
+is_valid_class_name(SV* sv)
+CODE:
+{
+ SvGETMAGIC(sv);
+ if(SvPOKp(sv) && SvCUR(sv) > 0){
+ UV i;
+ RETVAL = TRUE;
+ for(i = 0; i < SvCUR(sv); i++){
+ char const c = SvPVX(sv)[i];
+ if(!(isALNUM(c) || c == ':')){
+ RETVAL = FALSE;
+ break;
+ }
+ }
+ }
+ else{
+ RETVAL = SvNIOKp(sv) ? TRUE : FALSE;
+ }
+}
+OUTPUT:
+ RETVAL
+
+bool
is_class_loaded(SV* sv)
void
RETVAL
void
-generate_isa_predicate_for(SV* klass, SV* predicate_name = NULL)
+generate_isa_predicate_for(SV* arg, SV* predicate_name = NULL)
+ALIAS:
+ generate_isa_predicate_for = 0
+ generate_can_predicate_for = 1
PPCODE:
{
const char* name_pv = NULL;
CV* xsub;
- SvGETMAGIC(klass);
+ SvGETMAGIC(arg);
- if(!SvOK(klass)){
- croak("You must define a class name");
+ if(!SvOK(arg)){
+ croak("You must define %s", ix == 0 ? "a class name" : "method names");
}
if(predicate_name){
SvGETMAGIC(predicate_name);
if(!SvOK(predicate_name)){
- croak("You must define a predicate_name");
+ croak("You must define %s", "a predicate name");
}
name_pv = SvPV_nolen_const(predicate_name);
}
- xsub = mouse_generate_isa_predicate_for(aTHX_ klass, name_pv);
+ if(ix == 0){
+ xsub = mouse_generate_isa_predicate_for(aTHX_ arg, name_pv);
+ }
+ else{
+ xsub = mouse_generate_can_predicate_for(aTHX_ arg, name_pv);
+ }
if(predicate_name == NULL){ /* anonymous predicate */
- XPUSHs( newRV_noinc((SV*)xsub) );
+ mXPUSHs( newRV_inc((SV*)xsub) );
}
}