Siechfred: Coderef innerhalb von new() weitergeben

Beitrag lesen

ich möchte gerne bei der Erzeugung eines Modules mit new() gleichzeitig eine Code-Referenz an ein anderes Modul übergeben.

Soweit klar.

sub new {
    my ( $self, $Web ) = @_;
    croak( EC_1 ) unless $Web;

In $web soll deine Codereferenz stehen, richtig?

my %config;
    $config{ Web }     = $Web;

Und das soll dein Objekt werden, auch richtig?

my $self_ = bless( %config, $self );

Autsch. Verwende bitte nachvollziehbare Variablennamen. $self_ und $self sind zwei paar Schuhe.

$Web->add_Menu( sub { return $self_->main() }, [ "Item1", "Item2" ] );

Hier möchtest du den Code, der in $Web übergeben wurde, ausführen, richtig? Allerdings schreibst du, dass dies eine Codereferenz sei, die wird indes durch voranstellen eines '&' ausgeführt. Handelt es sich bei '$Web' vielleicht um ein Objekt?

Das ganze Funktioniert, wenn ich

return $self->main()

als anonyme Coderef übergebe, hat aber den Nachteil, daß ich das %Config noch nicht im $self habe und somit nicht das komplette Objekt besitze.

Was steht denn in %Config?

Meine Frage ist, ob jemand ne Ahnung hat wie man sowas realisiert

Irgendwie fehlen da noch Informationen. Ein funktionierendes Beispiel sähe so aus:

package Testmodul;  
  
sub new {  
  # der Paketname  
  my $pkg = shift;  
  # die Codereferenz  
  my $ref = shift;  
  # Zuweisung  
  my $obj = {coderef => $ref};  
  # Rückgabe des Objektes  
  return bless($obj, $pkg);  
}  
  
1;

Und im Einsatz:

use strict;  
use diagnostics;  
use Testmodul;  
  
my $instance = Testmodul->new( sub { print $_[0]; } );  
$instance->{coderef}->('foo');

was der Unterschied ist in folgenden Zeilen:
$self_ = bless( %config, $self ); return $self_;
return bless( %config, $self );

Die erste Zeile speichert die Objektreferenz zwischen, um möglicherweise damit hinterher noch was zu machen (weitere Wertzuweisungen usw. usf.) und natürlich muss schlussendlich noch return $self_; stehen. Die zweite Zeile gibt die Objektreferenz zurück, ohne sie zuvor zwischenzuspeichern.

Was bei dir allerdings genau schiefläuft, kann man wohl nur sagen, wenn du die dürftigen Infos durch entsprechende Codeteile aufbesserst und die gestellten Fragen beantwortest.

Siechfred

--
Ich bin strenggenommen auch nur interessierter Laie. (molily)