That's a problem with Perl's absolute minimal OO. People have recognized this, and several solutions are available. For instance, using inside-out objects, you can do this with minimal code changes:
package FunnyEmail;
use base Email::Simple;
use Hash::Util::FieldHash 'fieldhash'; ### Add this
fieldhash my %JOKE; ### Add this
sub new{
my $class = shift;
my $text = shift; # assume this gets passed
my $self=Email::Simple->new($text);
$JOKE{$self} = undef; ### Change this
bless $self,$class;
return $self;
}
Now your 'JOKE' attribute is in a lexical variable, and not accessable outside of the lexical scope. So, it would not clash with whatever Email::Simple is using, nor will it clash with anything a subclass of FunnyEmail would be doing.