Class-Rebirth
view release on metacpan or search on metacpan
lib/Class/Rebirth.pm view on Meta::CPAN
#
#
# or
#
# use Class::Rebirth;
# my $object = Class::Rebirth::rebirth( $zombie );
#
#
# It is also able to use a data dump instead of an object.
#
# my $object = Class::Rebirth::rebirth( $dump );
#
#
#
# AUTHOR
# ======
# Andreas Hernitscheck ahernit(AT)cpan.org
# @brief Takes a death object and and creates a living object of it.
# Such a zombie class looks like a normal class when you dump it.
# But it is not alive, means methods won't work. An Effect which
# happens by deserializing classes from a store (dumped data).
sub rebirth { # $object ($zombie)
my $zombie = shift or croak "requires zombie";
my $obj;
# if zombie is dump string, build an object first
if ($zombie =~ /^\$/){
$zombie = _createObjectByDump( $zombie );
}
my @pkgs = _getUsedPackagesOfObject($zombie);
foreach my $p (@pkgs){
eval("require $p;");
if ($@){die $@};
}
## rerun an eval to realy bring it back to life
my $target;
my $ser = Data::Dumper->Dump([$zombie],['$target']);
eval $ser;
if ($@){die $@};
return $target;
}
# Can use a data dump'ed string which
# starts with a variable assignment like $VAR1=
# @return object
sub _createObjectByDump{
my $dump = shift;
my $target;
# relace var with own var
$dump =~ s/^(\$[a-z0-9]+)/\$target/i;
eval $dump;
if ($@){die $@};
return $target;
}
# Does a deep search in object for
# used package names.
# @return list of packages
sub _getUsedPackagesOfObject{
my $obj = shift;
my @list;
if (Scalar::Util::blessed $obj){
push @list, ref($obj);
}
foreach my $k (keys %$obj){
my $value = $obj->{$k};
# walk down any hash to find more blessed objects
if (ref $obj->{$k} eq 'HASH'){
my @sublist = _getUsedPackagesOfObject( $value );
push @list, @sublist;
}
# is blessed object
if (Scalar::Util::blessed $value){
push @list, ref($obj);
my @sublist = _getUsedPackagesOfObject( $value );
push @list, @sublist;
}
}
# make unique strings
@list = uniq @list;
return @list;
}
1;
#################### pod generated by Pod::Autopod - keep this line to make pod updates possible ####################
( run in 1.625 second using v1.01-cache-2.11-cpan-97f6503c9c8 )