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 ]
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.