#!/usr/bin/perl
use lib '..';

use strict;
use warnings;
use Mail::Box::Manager;

use Devel::Leak;
use Mail::Message;
use Data::Dumper;
use Scalar::Util 'isweak';
        
my $leak = $ARGV[0];

my $data = << 'DATA';
simple body data
DATA
 
my $attach = Mail::Message::Body->new(data => << 'ATTACH');
simple attach text
ATTACH

LOOP:
my $msg;
my $dbg;
#prime all the "require foo" and other one time allocations
$msg = Mail::Message->build(From => "from\@example.com",
    To => "to\@example.com", data => $data, attach => $attach);
undef $msg;

my $count = Devel::Leak::NoteSV($dbg);
if ($leak) {
    $msg = Mail::Message->build(From => "from\@example.com",
        To => "to\@example.com", data => $data, attach => $attach);
     #this frees up 130 scalars
     #delete $msg->{MM_body}->{MMBM_parts};
     #show_addrs(\$msg);
     #delete $msg->{MM_body}->{MMBM_parts}[0];
} else {
    $msg = Mail::Message->build(From => "from\@example.com",
        To => "to\@example.com", data => $data);
}
undef $msg;
my $now = Devel::Leak::CheckSV($dbg);
# 296 leaks for multipart msg / 0 for simple
print $now - $count;
print " scalars leaked\n";
exit;
goto LOOP;

sub show_addrs($)
{   my $x = shift;
    print $x;
    my $y = $$x;
    if(! ref $y) { print  " scalar ".(defined $y ? $y : 'undef'), "\n" }
    elsif(isweak($$x)) { print "ref $y is weak\n" }
    elsif(UNIVERSAL::isa($y, 'HASH'))
    { print " hash\n";
       foreach my $k (sort keys %$y)
       {   print " $k => "; show_addrs(\$y->{$k});
       }
    }
    elsif(UNIVERSAL::isa($y, 'ARRAY'))
    {  print " array\n" ;
       for(my $i = 0; $i < @$y; $i++)
       { print " $i => "; show_addrs(\$y->[$i]);
       }
    }
}
