X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=blobdiff_plain;f=xs-src%2FMouse.xs;h=137e5a04b6d3301a4491f59092098232023300af;hp=c59c15cbe1fb79696e76fa2e1ec6f8dc84067fd7;hb=e3540312c014bf730083fab1d0af13c002691115;hpb=42108e9ca4e2394e54f76bdcde4bfd34eacfd646 diff --git a/xs-src/Mouse.xs b/xs-src/Mouse.xs index c59c15c..137e5a0 100644 --- a/xs-src/Mouse.xs +++ b/xs-src/Mouse.xs @@ -86,6 +86,46 @@ CODE: OUTPUT: RETVAL +void +generate_isa_predicate_for(SV* klass, const char* predicate_name = NULL) +PPCODE: +{ + STRLEN klass_len; + const char* klass_pv; + HV* stash; + CV* xsub; + + if(!SvOK(klass)){ + croak("You must define a class name for generate_for"); + } + klass_pv = SvPV_const(klass, klass_len); + klass_pv = mouse_canonicalize_package_name(klass_pv); + + if(strNE(klass_pv, "UNIVERSAL")){ + static MGVTBL mouse_util_type_constraints_vtbl; /* not used, only for identity */ + + xsub = newXS(predicate_name, XS_isa_check, __FILE__); + + stash = gv_stashpvn(klass_pv, klass_len, GV_ADD); + + CvXSUBANY(xsub).any_ptr = sv_magicext( + (SV*)xsub, + (SV*)stash, /* mg_obj */ + PERL_MAGIC_ext, + &mouse_util_type_constraints_vtbl, + klass_pv, /* mg_ptr */ + klass_len /* mg_len */ + ); + } + else{ + xsub = newXS(predicate_name, XS_isa_check_for_universal, __FILE__); + } + + if(predicate_name == NULL){ /* anonymous predicate */ + XPUSHs( newRV_noinc((SV*)xsub) ); + } +} + MODULE = Mouse PACKAGE = Mouse::Meta::Module