Philipp Hasenfratz: isMethod - schnelle Implementation

Halihallo

hab mal ne simple Frage:

kennt jemand (mir ist der Lösungsansatz abhanden gekommen) eine sehr, sehr schnelle Art, wie man überprüfen kann, ob die Klasse eine bestimmte Methode unterstützt?

Wie muss das '...' im folgenden Quelltext lauten?
Es gibt doch eine globale Variable, welche den Namensraum des Moduls festhält, nur kenne ich diese nicht mehr.

if (bla::{$name}) oder so ähnlich, oder?

so ala:

package bla;

use strict;

sub new { bless {}, shift }

sub isMethod {
   my ($self, $name) = @_;
   if (...) {
      return 1;
   } else {
      return undef;
   }
}

sub test {
   print "OK, test successful";
}

1;

package main;

use bla;

my $t = new bla;
if ($t -> isMethod('test')) {
   $t -> test;
}

1;

Viele Grüsse

Philipp

  1. Heureka, ich hab's gefunden...

    wen's noch interessiert:

    Aber eine Frage habe ich noch (aber vielleicht finde ich es in den nächsten fünf mins auch wieder raus)...

    Wie kann man das allgemein Formulieren? - Ich meine das
       my %h = %{bla::};

    my %h = %{__PACKAGE__::}; und
    my %h = %{'__PACKAGE__::'} geben mir immer Fehler...

    natürlich kann man das %h auch weglassen, ich weiss...

    Viele Grüsse

    Philipp

    _____________________________________________________________________

    package bla;

    use strict;

    sub new { bless {}, shift }

    sub isMethod {
       my ($self, $name) = @_;
       my %h = %{bla::};
       if ($h{$name}) {
          return 1;
       } else {
          return undef;
       }
    }

    sub test {
       print "OK, test successful";
    }

    package main;

    my $t = new bla;
    if ($t -> isMethod('test')) {
       $t -> test;
    } else {
       print "Method test unknown";
    }

    1;

    1. Nun,

      %{bla::};

      gibt mir den gesamten Namensraum des Moduls zurück, in meinem Fall spielt es keine Rolle, ob der Name nun auf eine Methode oder eine private Variable zeigt, der vollständigkeitshalber muss ich jedoch die Frage doch stellen:

      Wie kann ich denn wissen, ob ein Name wirklich auf eine Funktion zeigt und nicht auf eine Variable? - Muss ich dass mit einem lästigen eval prüfen? Oder geht's auch elegant?

      Und nun hoffentlich genug der Eigendiskussion, sonst wäre ein Board statt eines Forums ja die bessere Wahl, nich???

      Viele Grüsse

      Philipp

      1. Wie kann ich denn wissen, ob ein Name wirklich auf eine Funktion zeigt und nicht auf eine Variable? - Muss ich dass mit einem lästigen eval prüfen? Oder geht's auch elegant?

        perldoc UNIVERSAL

        1. Wie kann ich denn wissen, ob ein Name wirklich auf eine Funktion zeigt und nicht auf eine Variable? - Muss ich dass mit einem lästigen eval prüfen? Oder geht's auch elegant?

          perldoc UNIVERSAL

          THX. That's what I've asked for... Perfekt.

          Viele Grüsse

          Philipp

          PS: Ich musste feststellen, dass meine Variante auch funktioniert, da der Hash {bla::} nur Referenzen auf Methoden hat und gar keine Variablen indiziert. Dennoch:
          Das Problem, dass ich diesen pseudo-Hash nicht mit Variablen ansprechen kann (eg. {__PACKAGE__::} oder {(caller(1))[0]}::) etc.) hat sich somit gelöst (durch den Verweis auf UNIVERSAL)...
          Vielen Dank hierfür.