Email-MIME-XPath
view release on metacpan or search on metacpan
lib/Email/MIME/XPath.pm view on Meta::CPAN
# XXX a lot of trickery here is necessary because Email::MIME objects can be
# shared among multiple trees at once. We keep track of parent/address
# information inside the XPathEngine object, which is (originally) only inside
# the top-level part.
sub __build_parents {
my $self = shift;
return if $self->__xpath_engine->{__parent};
my $parent = $self->__xpath_engine->{__parent} = {};
my $address = $self->__xpath_engine->{__address} = {};
$self->__xpath_engine->{__root} = $self;
Scalar::Util::weaken($self->__xpath_engine->{__root});
my $id = 0;
$address->{$self} = sprintf("%03d", $id++);
if (__is_multipart($self)) {
my @q = $self;
while (@q) {
my $part = shift @q;
my @subparts = $part->parts;
for (@subparts) {
$parent->{$_} = $part;
Scalar::Util::weaken $parent->{$_};
$address->{$_} = sprintf("%03d", $id++);
# XXX this will cause collisions if more than one Email::MIME::XPath
# shares parts
$_->{__xpath_engine} = $self->__xpath_engine;
Scalar::Util::weaken $_->{__xpath_engine};
}
push @q, grep { __is_multipart($_) } @subparts;
}
}
}
sub __xpath_parent {
$_[0]->__xpath_engine->{__parent}->{$_[0]}
}
( run in 0.426 second using v1.01-cache-2.11-cpan-65fba6d93b7 )