I posted a problem I was having with the destruct sequence about a
month ago. I subsequently was swamped and, since it was at the end of
the program, I let it go. I also found some problems with another
module's error handling that I thought was really causing the problem.
With that access fixed, I still get errors.
I have had some breathing room, so I'd like to see if I can provide
enough info this time around. I tried to recreate with a small test,
but I've had trouble. I'd like to see what folks think with the larger
set of code.
Some info up front:
$ pmvers Moose
0.72
$ pmvers Class::MOP
0.78
Perl is 5.10.0
My issue can be seen from the following at the end of my log file:
00: No messages on queue. Bye!
01: In LTH::Mqueue::DEMOLISH() (LTH::Mqueue=HASH(0x1c4d0d8))
02: In LTH::DEMOLISH() (LTH::Mqueue=HASH(0x1c4d0d8))
03: In LTH::Config::DEMOLISH() (LTH::Config=HASH(0x18eea0))
(in cleanup) Can't call method "execute" on an undefined value
at /opt/perl.v5.10.0/lib/site_perl/5.10.0/Moose/Object.pm line 55
during global destruction.
04: In LTH::Message::ETN::DEMOLISH() (LTH::Message::ETN=HASH(0x1bd3250))
05: In LTH::Message::DEMOLISH() (LTH::Message::ETN=HASH(0x1bd3250))
(in cleanup) Can't call method "execute" on an undefined value
at /opt/perl.v5.10.0/lib/site_perl/5.10.0/Moose/Object.pm line 55
during global destruction.
00) The application, having no work to do, does and exit(0)
01) It is decided that the first object to destroy is the LTH::Mqueue
object (line 01, 0x1c4d0d8). Why? I do not know.
02) In doing so, it destroys its PARENT LTH (line 02, same object,
0x1c4d0d8), including the metadata?
03) Next to be destroyed is the LTH::Config object at line 03 and this
has a problem. This is probably because the destruct of LTH at line 2
blew away the parent LTH meta data?
04) LTH::Message::ETN is destroyed at line 04
05) LTH::Message is next to be destroyed, but cannot, again because
the destruct of LTH at line 2 probably blew away the parent LTH meta
data?
Do I have the diagnosis right? Here are the relevent parts of the
modules. Now, I know that I really don't need these DEMOLISH subs, but
even so, they should work, right? I would think that the destruct
sequence would be
LTH::Message::ETN
then, in any order
LTH::Message
LTH::Mqueue
LTH::Config
and finally
LTH
Is this a bad assumption?
Relevent portions of modules
##LTH
...
sub DEMOLISH {
my $self = shift;
LogEcho ("In LTH::DEMOLISH() ($self)");
}
##LTH::Mqueue
extends 'LTH';
...
sub DEMOLISH {
my $self = shift;
LogEcho ("In LTH::Mqueue::DEMOLISH() ($self)");
}
##LTH::Config
extends 'LTH';
...
sub DEMOLISH {
my $self = shift;
LogEcho ("In LTH::Config::DEMOLISH() ($self)");
}
##LTH::Message
extends 'LTH';
...
sub DEMOLISH {
my $self = shift;
LogEcho ("In LTH::Message::DEMOLISH() ($self)");
if ($self->save_conn_is_open()) {
for (values(%{$self->save_conn()->{CachedKids}})) {
$_->finish();
}
$self->save_conn()->disconnect();
}
}
##LTH::Message::ETN
extends 'LTH::Message';
...
sub DEMOLISH {
my $self = shift;
LogEcho ("In LTH::Message::ETN::DEMOLISH() ($self)");
}
--
Matthew O. Persico