2 Stimmen

Überladen von Moose-Objekt mit Sub-Moose-Objekt, um eine normale Datenstruktur zu erhalten

Ich versuche, ein Elch-Objekt zu erhalten, die Elch-Objekte als nur eine verschachtelte Reihe von einfachen Perl-Datentypen referenziert werden, die ich als ein Hashref verweisen kann. z.B..

my $ref = { %{ $obj } }

und die Struktur könnte wie folgt aussehen

{
  name => "bob",
  phones => [
    {
      phone_number => "15555554698"
    },
  ]
}

anstelle von

bless( {
  name => "bob",
  phones => [
    bless( {
      phone_number => "15555554698"
    }, 'PhoneNumber' )
  ]
}, 'User' )

hier ist mein Versuch

use overload '%{}' => '_hashref';

sub _hashref {
    my $self = shift;

    foreach my $attr ( $self->meta->get_all_attributes ) {
        if ( $attr->has_read_method ) {
            say $attr->name;
            say $attr->get_value( $self );

        }
    }
    return {};
}

leider get_value scheint etwas Rekursives zu tun und läuft so lange, bis es zu einem Seg-Fehler kommt. Ich habe versucht, es zu übergeben __PACKAGE__ und einfach 'User' aber beides scheint nicht zu funktionieren. Hat jemand irgendwelche Vorschläge, wie ich die Attribute und die Werte erhalten könnte, so dass ich mit ihnen arbeiten kann? oder einen anderen intelligenteren Weg, dies zu tun? Hinweis: Ich bin mir bewusst, dass ich derzeit eine leere Hashref zurückgeben, an dieser Stelle nur versuchen, herauszufinden, wie ich an die Werte erhalten könnte

5voto

hobbs Punkte 204816

Die "rekursive" Sache, die get_value ist der Versuch, auf
$self->{$slot_name} die Ihr %{} Überlast, die die get_value ... Sie können dies umgehen, indem Sie die Überladung vorübergehend ausschalten (es gibt eine Beispiel in den Überlastungsdokumenten ), oder Sie könnten aufhören zu versuchen, neu zu implementieren, was MooseX::Lagerung ist bereits ziemlich gut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X