Revision e50a9622
Von Moritz Bunkus vor fast 12 Jahren hinzugefügt
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
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.