NAME
Quiq::Object - Basisklasse für alle Klassen der Klassenbibliothek
SYNOPSIS
package MyClass;
use base qw/Quiq::Object/;
...
METHODS
Blessen
bless() - Blesse Objekt auf Klasse
Synopsis
$obj = $class->bless($ref);
Description
Objektorientierte Syntax für bless(). Blesse Objekt (Referenz) $ref auf Klasse $class und liefere die geblesste Referenz zurück. Dies geht natürlich nur, wenn $class eine direkte oder indirekte Subklasse von Quiq::Object ist.
Der Aufruf ist äquivalent zu:
$obj = bless $ref,$class;
Example
$hash = Hash->bless({});
rebless() - Blesse Objekt auf eine andere Klasse
Synopsis
$obj->rebless($class);
Description
Blesse Objekt $obj auf Klasse $class um.
Der Aufruf ist äquivalent zu:
bless $obj,$class;
Example
$hash->rebless('MyClass');
Parameterübergabe
parameters() - Argumente und Optionen eines Methodenaufrufs
Synopsis
[1] $this->parameters(\@param,@optRef);
[2] $this->parameters($sloppy,\@param,@optRef);
[3] $argA = $this->parameters($minArgs,$maxArgs,\@param,@optRef);
[4] $argA = $this->parameters($sloppy,$minArgs,$maxArgs,\@param,@optRef);
Arguments
- $sloppy
-
Wirf keine Exception, wenn unerwartete Parameter (also Optionen und Argumente) in @param enthalten sind. Diese Parameter werden aus @param nicht entfernt, bleiben also für eine weitere Verarbeitung stehen.
- $minArgs
-
Mindestanzahl an Argumenten.
- $maxArgs
-
Maximale Anzahl an Argumenten.
- @params
-
Liste der Parameter, typischerweise @_.
- @optRef
-
Liste der erwarteten Optionen zusammen mit Referenzen auf die zugehörigen Optionsvariablen.
Returns
Description
Liefere die Argumente und Optionen eines Methodenaufrufs. Die Methode kann eine Klassen- oder Objektmethode sein. Das Argument @params ist typischerweise @_. Parameters() behandelt den Fall sehr effizient, dass @params leer ist, denn dann kehrt parameters() sofort zurück.
[1] Wenn die Methode eine feste Anzahl an Argumenten besitzt und diese von ihr selbst behandelt werden, ist die Nutzung am effizientesten. Denn die Argumente müssen von parameters() dann nicht kopiert werden und wenn der Methodenaufruf ohne Optionen erfolgt, kehrt parameters(), sofort zurück. Beispiel:
sub myMethod {
my ($this,$arg1,$arg2,$arg3) = splice @_,0,4;
# Optionen
my $opt1 = 1;
my $opt2 = 2;
$this->parameters(\@_,
-opt1 => \$opt1,
-opt2 => \$opt2,
);
# ...
}
[2] Wie [1], nur dass keine Exception geworfen wird, wenn unbekannte Parameter übergeben werden. Diese bleiben in @_ stehen. Dies ist nützlich, wenn die Methode zusätzliche Parameter empfängt und diese unbesehen an eine andere Methode weiterleitet. Der Aufruf von parameters() ändert sich zu:
$this->parameters(1,\@_,
-opt1 => \$opt1,
-opt2 => \$opt2,
);
[3], [4] Wie [1] bzw. [2], nur dass parameters() zusätzlich die Argumente der Methode behandelt. Dies ist nützlich, wenn die Methode eine variable Anzahl an Argumenten hat. Diese werden von parameters() aus der Parameterliste "herausgefischt" und eine Referenz auf diese Liste zurückgegeben. Beispiel:
sub myMethod {
my $this = shift;
# Optionen und Argumente
my $opt1 = 1;
my $opt2 = 2;
$argA = $this->parameters(0,\@_,
-opt1 => \$opt1,
-opt2 => \$opt2,
);
my ($arg1,$arg2,$arg3,$arg4) = @$argA;
# ...
}
Exceptions
throw() - Wirf Exception
Synopsis
$this->throw;
$this->throw(@opt,@keyVal);
$this->throw($msg,@opt,@keyVal);
Options
- -stdout => $bool (Default: 0)
-
Erzeuge die Meldung auf STDOUT (statt STDERR), wenn -warning => 1 gesetzt ist.
- -stacktrace => $bool (Default: 1)
-
Ergänze den Exception-Text um einen Stacktrace.
- -warning => $bool (Default: 0)
-
Wirf keine Exception, sondern gib lediglich eine Warnung aus.
Description
Wirf eine Exception mit dem Fehlertext $msg und den hinzugefügten Schlüssel/Wert-Paaren @keyVal. Die Methode kehrt nur zurück, wenn Option -warning gesetzt ist.
Sonstiges
addMethod() - Erweitere Klasse um Methode
Synopsis
$this->addMethod($name,$ref);
Description
Füge Codereferenz $ref unter dem Namen $name zur Klasse $this hinzu. Existiert die Methode bereits, wird sie überschrieben.
Example
MyClass->addMethod(myMethod => sub {
my $self = shift;
return 4711;
});
classFile() - Pfad der .pm-Datei
Synopsis
$dir = $this->classFile;
Description
Ermitte den Pfad der .pm-Datei der Klasse $this und liefere diesen zurück. Die Klasse muss bereits geladen worden sein.
Example
$path = Quiq::Object->classFile;
==>
<PFAD>Quiq/Object.pm
methodName() - Liefere Namen der ausgeführten Methode
Synopsis
$name = $this->methodName;
Returns
Description
Ermittele den Namen der ausgeführten Methode und liefere diesen zurück.
this() - Liefere Klassenname und Objektreferenz
Synopsis
($class,$self,$isClassMethod) = Quiq::Object->this($this);
$class = Quiq::Object->this($this);
Arguments
Returns
- $class
-
(String) Klassenname
- $self
-
(Referenz) Objektreferenz.
- $isClassMethod
-
(Boolean) Zeigt an, ob die Methode als Klassenmethode gerufen wurde.
Description
Liefere Klassenname und/oder die Objektreferenz zu Parameter $this und zeige auf dem dritten Rückgabewert an, ob die Methode als Klassen- oder Objektmethode gerufen wurde.
Ist $this ein Klassenname (eine Zeichenkette) liefere den Namen selbst, als Objektreferenz undef
und als dritten Rückgabewert
Ist $this eine Objektreferenz, liefere den Klassennamen zur
Objektreferenz, die Objektreferenz selbst und als dritten Rückgabewert 0.
Im Skalarkontext liefere nur den Klassennamen.
Example
Klassen- sowie Objektmethode:
sub myMethod { my ($class,$self) = Quiq::Object->this(shift); if ($self) { # Aufruf als Objektmethode } else { # Aufruf als Klassenmethode } }
Klassenmethode, die als Objektmethode gerufen werden kann:
sub mymethod { my $class = Quiq::Object->this(shift); ... }
Objektmethode, die als Klassenmethode gerufen werden kann:
sub myMethod { my ($class,$self,$isClassMethod) = Quiq::Object->this(shift); $self = $class->new(@_); # Ab hier ist mittels $self nicht mehr feststellbar, # ob die Methode als Klassen- oder Objektmethode gerufen wurde. # Die Variable $isclassmethod zeigt es an. $self->specialMethod if $isClassMethod; ... }
VERSION
1.206
AUTHOR
Frank Seitz, http://fseitz.de/
COPYRIGHT
Copyright (C) 2022 Frank Seitz
LICENSE
This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.