I believe tjd got the answer. If you add a DESTROY() and AUTOLOAD() method to the test package, you will get only one warning (about the absence of @test::ISA).
package test;
use strict;
sub DESTROY {}
sub AUTOLOAD {}
You generally need to make sure that the packages listed in the @ISA list have already been loaded. In your example, you might have expected to see something like:
package test;
use strict;
use missing;
our @ISA = ('missing');
It is a bit curious that your package doesn't have an explicit new() method. Instead, you have a statement that calls bless();
If you had a new() method, like this:
sub new() { return bless {}, __PACKAGE__; }
Then you would not see the triple error message until something called new();
package main;
my $object = test->new(); # Triple warning
You might want to use the pragma 'base', which will give you a fatal error saying that it cannot load the 'missing' package:
package test;
use strict;
use base ('missing');
sub new { bless {}, __PACKAGE__);
The base pragma attempts to load the missing package for you. You do not need a separate 'use missing' statement.
So the final thing might look like this:
package test;
use strict;
use warning;
use base ('missing');
sub new { bless {}, __PACKAGE__);
sub DESTROY {}
sub AUTOLOAD {}
1;
You could then wrap this all into a file called test.pm and use it in a script:
use strict;
use test;
my $object = test->new(); # Should fatal, as there is no 'missing' module
Hope this helps.