use v5.12; use strict; use warnings; use JSON::MaybeXS; package MyApp { use Zydeco; role ToJson { method TO_JSON { return { %$self }; } } role Named { has NAME ( is => bare, type => Str, reader => 'getName', ); } class MyClassA with ToJson, Named { has MY_CLASS_B ( is => bare, reader => 'getClassB', writer => 'setClassB', type => 'MyClassB', ); } class MyClassB with ToJson, Named { coerce from HashRef via new; } } my $a = MyApp->new_myclassa( NAME => 'A instance' ); my $b = MyApp->new_myclassb( NAME => 'B instance' ); $a->setClassB($b); my $json = JSON->new->convert_blessed->encode($a); say $json; my $inflated = MyApp->new_myclassa( JSON->new->decode($json) ); say $inflated->getClassB->getName;