The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Quiq::ClassConfig - Verwalte Information auf Klassenebene

SYNOPSIS

Klasse einbinden:

    use base qw/... Quiq::ClassConfig/;

Information definieren (Anwendungsbeispiel):

    package Model::Object;
    
    __PACKAGE__->def(
        table => 'Object',
        prefix => 'Obj',
        columns => [
            id => {
                domain => 'Integer',
                primaryKey => 1,
                notNull => 1,
                description => 'Primärschlüssel',
            },
            ...
        ],
        ...
    );

Information abfragen:

    my $table = Model::Object->defGet('table');
    =>
    Object

Information suchen:

    my $table = Model::Object->defSearch('table');
    =>
    Object

DESCRIPTION

Die Klasse ermöglicht, Information in Klassen zu hinterlegen und abzufragen. Anstatt hierfür Klassenvariablen mit our zu definieren, verwaltet die Klasse sämliche Information in einem einzigen Hash (je Klasse natürlich) mit dem Namen %ClassConfig. Die Methoden der Klasse verwalten (erzeugen, setzen, lesen) diesen Hash.

METHODS

Information definieren

def() - Definiere/Setze Klassen-Information

Synopsis

    $h = $class->def(@keyVal);

Arguments

@keyVal

Liste der Schlüssel/Wert-Paare

Returns

Referenz auf den Hash

Description

Erzeuge einen globalen Hash in Klasse $class und weise diesem die Schlüssel/Wert-Paare @keyVal zu. Existiert der Hash bereits, wird er nicht neu erzeugt.

Information abfragen

defGet() - Liefere Klassen-Information

Synopsis

    $val = $class->defGet($key);
    @vals = $class->defGet(@keys);

Arguments

$key bzw. @keys

Schlüssel bzw. Liste von Schlüsseln.

Returns

$val bzw. @vals

Wert bzw. Liste von Werten.

Description

Liefere die Werte zu den Schlüsseln @keys. Im Skalarkontext liefere den Wert des ersten Schlüssels.

defMemoize() - Berechne und chache Klassen-Information

Synopsis

    $val = $class->defMemoize($key,$sub);

Arguments

$key

Schlüssel

$sub

Subroutine, die den Wert berechnet. Diese hat den Aufbau

    sub {
        my ($class,$key) = @_;
        ...
        return $val;
    }

Returns

$val

Berechneter bzw. gecachter Wert

Description

Berechne den Wert per Subroutine $sub, speichere ihn unter dem Schlüssel $key und liefere ihn schließlich zurück. Der Wert wird nur beim ersten Aufruf berechnet, danach wird der gespeicherte Wert unmittelbar geliefert.

Information suchen

defSearch() - Suche Klassen-Information in Vererbungshierarchie

Synopsis

    $val = $class->defSearch($key);

Arguments

$key

Schlüssel der Information.

Returns

Die gesuchte Information oder undef.

Description

Suche "von unten nach oben" in der Vererbungshierarchie, beginnend mit Klasse $class, die Information $key. Die erste Klasse, die die Information besitzt, liefert den Wert. Existiert die Information nicht, wird undef geliefert.

defCumulate() - Sammele Klassen-Information entlang Vererbungshierarchie

Synopsis

    @arr | $arr = $class->defCumulate($key);

Arguments

$key

Schlüssel der Information.

Returns

Liste der Werte. Im Skalarkontext eine Referenz auf die Liste.

Description

Durchlaufe die Klassenhierarchie von oben nach unten und sammele alle Werte des Attributs $key ein und liefere die Liste der Werte zurück.

Diese Methode ist nützlich, wenn z.B. Attributnamen entlang einer Vererbungshierarchie definiert werden (je höher die Klasse desto allgemeiner das Attribut) und für eine gegebene Klasse die Liste der Attributnamen bestimmt werden soll.

Example

Klassenhierarchie:

    package Object;
    use base/Quiq::ClassConfig/;
    
    __PACKAGE__->def(
        Attributes => [qw/
            Id
        /],
    );
    
    package Person;
    use base qw/Object/;
    
    __PACKAGE__->def(
        Attributes => [qw/
            Vorname
            Nachname
        /],
    );

Attributes der Klasse Person:

    @attributes = Person->defCumulate('Attributes');
    =>
    ('Id', 'Vorname', 'Nachname')

VERSION

1.156

AUTHOR

Frank Seitz, http://fseitz.de/

COPYRIGHT

Copyright (C) 2019 Frank Seitz

LICENSE

This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.