Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision e50a9622

Von Moritz Bunkus vor fast 12 Jahren hinzugefügt

  • ID e50a96228a0f46ffbc7548848fb051094b463f17
  • Vorgänger 117fefac
  • Nachfolger 2a201b35

Stringifizierbare Klassen laden, bevor YAML::Load() aufgerufen wird

Hintergrund. Normalerweise dumpt YAML Klassen sinnvoll, sprich mit
Typus, Paketnamen und Innereien. Für eine Instanz von
SL::Locale::String könnte das z.B. so aussehen:

--- !!perl/hash:SL::Locale::String
untranslated: Invoice

Lädt mal das wieder, so entsteht daraus auch ein Objekt. Allerdings
ist es zwingend erforderlich, dass Perl die Klassendefinition zum
Zeitpunkt von YAML::Load() bereits gesehen hat. Ansonsten geht die
Stringifizierung verloren, weil sie zum Zeitpunkt des "bless()"ens
nicht bekannt war.

Das passierte mit normalen CGI, weil der Controller selber erst nach
dem Auslesen der Session via "require..." geladen wird, der Controller
lädt Rose-DB-Model, das lädt SL::Locale::String.

Unterschiede anzeigen:

SL/Auth/SessionValue.pm
2 2

  
3 3
use strict;
4 4

  
5
# Classes that overload stringification must be known before
6
# YAML::Load() is called.
7
use SL::Locale::String ();
8

  
5 9
use Scalar::Util qw(weaken);
6 10
use YAML;
7 11

  
......
33 37

  
34 38
sub get_dumped {
35 39
  my ($self) = @_;
40
  local $YAML::Stringify = 1;
36 41
  return YAML::Dump($self->get);
37 42
}
38 43

  

Auch abrufbar als: Unified diff