From e50a96228a0f46ffbc7548848fb051094b463f17 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Wed, 30 Jan 2013 12:55:41 +0100 Subject: [PATCH] Stringifizierbare Klassen laden, bevor YAML::Load() aufgerufen wird MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/SL/Auth/SessionValue.pm b/SL/Auth/SessionValue.pm index 6bf65b923..cb1c7e386 100644 --- a/SL/Auth/SessionValue.pm +++ b/SL/Auth/SessionValue.pm @@ -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); } -- 2.20.1