Mouse::Util::does_role() respects $thing->does() method
[gitmo/Mouse.git] / xs-src / MouseAttribute.xs
index 6958375..7a453fd 100644 (file)
@@ -15,7 +15,7 @@ mouse_build_xa(pTHX_ SV* const attr) {
     ENTER;
     SAVETMPS;
 
-    xa    = newAV();
+    xa = newAV();
 
     mg = sv_magicext(SvRV(attr), (SV*)xa, PERL_MAGIC_ext, &mouse_xa_vtbl, NULL, 0);
     SvREFCNT_dec(xa); /* refcnt++ in sv_magicext */
@@ -184,6 +184,7 @@ mouse_xa_set_default(pTHX_ AV* const xa, SV* const object) {
     return value;
 }
 
+/* checks $isa->does($does) */
 static void
 mouse_check_isa_does_does(pTHX_ SV* const klass, SV* const name, SV* const isa, SV* const does){
     STRLEN len;
@@ -271,6 +272,7 @@ void
 _process_options(SV* klass, SV* name, HV* args)
 CODE:
 {
+    /* TODO: initialize 'xa' here */
     SV** svp;
     SV* tc = NULL;
 
@@ -319,7 +321,7 @@ CODE:
             "without a default, builder, or an init_arg", name);
     }
 
-     /* taken from Mouse::Meta::Attribute->new and ->_process_args */
+    /* taken from Mouse::Meta::Attribute->new and ->_process_args */
 
     svp = hv_fetchs(args, "is", FALSE);
     if(svp){
@@ -337,10 +339,12 @@ CODE:
             else{
                 svp = hv_fetchs(args, "accessor", TRUE);
             }
-            sv_setsv(*svp, name);
+            if(!SvOK(*svp)) {
+                sv_setsv(*svp, name);
+            }
         }
         else if(strEQ(is, "bare")){
-            /* do nothing, but don't complain (later) about missing methods */
+            /* do nothing, but might complain later about missing methods */
         }
         else{
             mouse_throw_error(klass, NULL,
@@ -472,7 +476,7 @@ CODE:
     if(svp && sv_true(*svp)){
         if(!(has_default || has_builder)){
             mouse_throw_error(klass, NULL,
-                "You cannot have lazy attribute (%"SVf") without specifying "
+                "You cannot have a lazy attribute (%"SVf") without specifying "
                 "a default value for it", name);
         }
     }