Stringifizierbare Klassen laden, bevor YAML::Load() aufgerufen wird
authorMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 30 Jan 2013 11:55:41 +0000 (12:55 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 30 Jan 2013 12:21:17 +0000 (13:21 +0100)
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.

SL/Auth/SessionValue.pm

index 6bf65b9..cb1c7e3 100644 (file)
@@ -2,6 +2,10 @@ package SL::Auth::SessionValue;
 
 use strict;
 
+# Classes that overload stringification must be known before
+# YAML::Load() is called.
+use SL::Locale::String ();
+
 use Scalar::Util qw(weaken);
 use YAML;
 
@@ -33,6 +37,7 @@ sub get {
 
 sub get_dumped {
   my ($self) = @_;
+  local $YAML::Stringify = 1;
   return YAML::Dump($self->get);
 }