# After this module is loaded, perl object can be pickled
# The perl objects can even contain python objects that contain
# perl objects that contain python objects that...
#
# You are not supposed to use any functions from this module.
# Just use Pickle as usual.
#
# Copyright 2000-2001 ActiveState
import perl
perl.require("Storable")
perl.callm("VERSION", "Storable", 0.7);
storable_thaw = perl.get_ref("Storable::thaw")
storable_nfreeze = perl.get_ref("Storable::nfreeze")
def perl_restore(frozen):
return storable_thaw(frozen)
def perl_reduce(o):
return (perl_restore,
(storable_nfreeze(o),)
)
import copy_reg
copy_reg.pickle(type(perl.get_ref("$")), perl_reduce, perl_restore)
del(copy_reg)
from cPickle import dumps, loads
# Make the dumps and loads functions available for perl
f = perl.get_ref("$Python::Object::pickle_dumps", 1)
f.__value__ = dumps;
f = perl.get_ref("$Python::Object::pickle_loads", 1)
f.__value__ = loads;
del(f)
perl.eval("""
package Python::Object;
sub STORABLE_freeze {
my($self, $cloning) = @_;
return Python::funcall($pickle_dumps, $self, 1);
}
sub STORABLE_thaw {
my($self, $cloning, $serialized) = @_;
my $other = Python::funcall($pickle_loads, $serialized);
Python::PyO_transplant($self, $other);
return;
}
""")