Vererbung innerhalb eines package

Begonnen von Damian, 11 März 2017, 20:06:21

Vorheriges Thema - Nächstes Thema

Damian

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?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Dr. Boris Neubert

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Thorsten Pferdekaemper

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
FUIP

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Thorsten Pferdekaemper

FUIP

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

justme1968

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 {...}


hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Damian

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.


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF