"static" call to UNIVERSAL::can
authorNick Ing-Simmons <Nick.Ing-Simmons@tiuk.ti.com>
Thu, 21 Nov 1996 15:47:46 +0000 (15:47 +0000)
committerChip Salzenberg <chip@atlantic.net>
Tue, 26 Nov 1996 08:48:00 +0000 (20:48 +1200)
Is there some reason why 'can' does not allow a class name,
but (silently) insists on an instance?

I wanted to do this :

sub Construct
{
 my $class = (caller(0))[0];

 if ($class->can('Something'))
  {
   ...
  }
 else
  {
   ...
  }
}

can just returns undef in this case, even if class has method in
question.

Anyone object to a patch?

p5p-msgid: <199611211407.OAA14645@pluto>
private-msgid: <199611211547.PAA15878@pluto>

universal.c

index ea797ae..476b60d 100644 (file)
@@ -134,6 +134,7 @@ XS(XS_UNIVERSAL_can)
     SV   *rv;
     GV   *gv;
     CV   *cvp;
+    HV   *pkg = NULL;
 
     if (items != 2)
        croak("Usage: UNIVERSAL::can(object-ref, method)");
@@ -142,8 +143,17 @@ XS(XS_UNIVERSAL_can)
     name = (char *)SvPV(ST(1),na);
     rv = &sv_undef;
 
-    if(SvROK(sv) && (sv = (SV*)SvRV(sv)) && SvOBJECT(sv)) {
-        gv = gv_fetchmethod(SvSTASH(sv), name);
+    if(SvROK(sv)) {
+        sv = (SV*)SvRV(sv);
+        if(SvOBJECT(sv))
+            pkg = SvSTASH(sv);
+    }
+    else {
+        pkg = gv_stashsv(sv, FALSE);
+    }
+
+    if (pkg) {
+        gv = gv_fetchmethod(pkg, name);
 
         if(gv && GvCV(gv)) {
             /* If the sub is only a stub then we may have a gv to AUTOLOAD */