From
perlmod:
In addition, when unqualified, the
identifiers STDIN, STDOUT, STDERR, ARGV, ARGVOUT, ENV,
INC, and SIG are forced to be in package `main', even when
used for other purposes than their built-in ones.
So when you try and use those as bare subnames, they get forced into main, try main->ARGV instead of foo->ARGV to see the 'in foo:' message. To specifically make an ARGV (or one of the other names forced into main) sub in 'foo', qualify your name, like this:
sub foo::ARGV { print "in foo::ARGV\n" }
Now foo->ARGV will do what you expect.