X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=xs-src%2FMouse.xs;h=59070e42f790de414c5065109f62740b9dcd9cac;hb=7801fbf000c65bbd5228728424f935b87fcd518e;hp=a538e413a65690d1fce24c5b3158129830329a7d;hpb=a5df48e596d4b685f53bf59ef581d6999ab14eb6;p=gitmo%2FMouse.git diff --git a/xs-src/Mouse.xs b/xs-src/Mouse.xs index a538e41..59070e4 100644 --- a/xs-src/Mouse.xs +++ b/xs-src/Mouse.xs @@ -19,7 +19,7 @@ BOOT: bool -is_class_loaded(SV* sv = &PL_sv_undef) +is_class_loaded(SV* sv) void get_code_info(CV* code) @@ -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