The OP should note also that if he or she had had the statement use warnings; at the start of the DoStuff.pm file, it would have been apparent that my $self ... in the statement my $self->pop = shift; masked the lexical variable of the same name defined and initialized in the my $self = shift; statement of the immediately preceding line.