Minor correction: object state serialization works for any blessed type in Perl, not just references to hashes.
package XX;
sub new { bless([1,2,3],__PACKAGE__) }
package YY;
sub new { $abc="abc"; bless(\$abc,__PACKAGE__) }
package ZZ;
sub new { $ott=123; bless(\$ott,__PACKAGE__) }
package main;
use Data::Dumper;
print +(Dumper(new XX));
print +(Dumper(new YY));
print +(Dumper(new ZZ));
__OUTPUT__
$VAR1 = bless( [
1,
2,
3
], 'XX' );
$VAR1 = bless( do{\(my $o = 'abc')}, 'YY' );
$VAR1 = bless( do{\(my $o = 123)}, 'ZZ' );
You are right that state serialization only works when the state is entirely referenced through that blessed value. You could even say that it's breaking package encapsulation.
But state serialization is, as the name implies, writing the state of the object, not the state of the package which manages the object. If you want to implement a new object model on top of the one Perl has got already, including flyweight or inside-out, then your new object model will have to be responsible for any serialization tasks. Unfortunately, that means that packages with non-native object models must document that they need special handling for serialization.
-- [ e d @ h a l l e y . c c ]
|