FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: Damian am 11 März 2017, 20:06:21

Titel: Vererbung innerhalb eines package
Beitrag von: Damian am 11 März 2017, 20:06:21
Ich möchte eigene Funktionen innerhalb eines Moduls kapseln. Dafür würde ich package verwenden, allerdings würde ich gern innerhalb des package alle anderen Funktionen von main weiterhin verwendbar machen wollen.

Wie kann ich das realisieren?
Titel: Antw:Vererbung innerhalb eines package
Beitrag von: Dr. Boris Neubert am 11 März 2017, 20:10:08
main::foobar()
Titel: Antw:Vererbung innerhalb eines package
Beitrag von: Damian am 11 März 2017, 20:14:40
Zitat von: Dr. Boris Neubert am 11 März 2017, 20:10:08
main::foobar()

das weiß ich, ich möchte die Funktionen aus main aber ohne main:: ansprechbar machen.
Titel: Antw:Vererbung innerhalb eines package
Beitrag von: Thorsten Pferdekaemper am 11 März 2017, 20:45:24
Hi,
also vielleicht so ungefähr...

no strict;
foreach my $entry (key %main::) {
    next unless(ref($main::{$entry}) eq "CODE");
    ${__PACKAGE__."::"}{$entry} = $main::{$entry};
}
use strict;

Ausprobiert habe ich das nicht.
Gruß,
   Thorsten
Titel: Antw:Vererbung innerhalb eines package
Beitrag von: Damian am 11 März 2017, 20:48:13
Das muss doch einfacher gehen:

Ich habe an so etwas gedacht:

{
  package meineunterklasse;
  @ISA=("meineklasse");
}

aus https://de.wikibooks.org/wiki/Perl-Programmierung:_Objektorientiert_Programmieren_in_Perl

@ISA kennt er bei mir aber nicht.
Titel: Antw:Vererbung innerhalb eines package
Beitrag von: Thorsten Pferdekaemper am 11 März 2017, 20:58:55
http://www.xinotes.net/notes/note/176/
Hilft das?
Titel: Antw:Vererbung innerhalb eines package
Beitrag von: Damian am 11 März 2017, 21:08:32
schon alles probiert.

{
package test1;
sub TS ($)
{
my ($WT) = @_;
return ("$WT bla");
}
}
{
package test;
@ISA=qw(test1);
use strict;
eval ('
sub TT ($)
{
my ($WT) = @_;
return ("$WT bla");
}');

print TT("test1");

print TS("test1");
}


TS kennt er nicht. eval ist hier Absicht, da die Definition vom User kommt.
Titel: Antw:Vererbung innerhalb eines package
Beitrag von: justme1968 am 11 März 2017, 21:53:15
schau dir mal Exporter an. das macht glaube ich im prinzip was du willst.

aber ist das wirklich das was du willst? du willst packages damit sich namen nicht ins gehege kommen möchtest dann aber trozdem ohne namespace zugreifen. in dem du den namespace wieder weg nimmst erzeugst du doch potentiell genau wieder die konflikte die du vermeiden willst. du kannst auch von aussen nicht einen festen namespace für das eval vorgeben, da jedes eval dann in diesem namespace läuft und sich dann zwei evals ins gehege kommen.

vielleicht kommst du mit anonymen routinen und/oder pointern darauf weiter. d.h. der anwender schreibt nur {...}


Titel: Antw:Vererbung innerhalb eines package
Beitrag von: Damian am 11 März 2017, 22:15:12
Hintergrund ist dieses: https://forum.fhem.de/index.php/topic,68705.msg603062.html#msg603062

Ich wollte pro Instanz ein eigenes package erzeugen.

Der User sollte aber nicht mit package-Angaben hantieren müssen wie im Beispiel.

Man kann natürlich die Kapselung weg lassen, aber dann bin ich wieder bei myUtils, wo man nur hoffen kann, dass der User sich eigene Funktionen ausdenkt, die nicht kollidieren und er die Präfix-Vorgabe einhält - aber dieses Vorgehen das gefällt mir nicht.