As far as I know, perl does prototype base argument parsing at *compile* time. So the fully qualified examples work because perl knows exactly which subroutine Foo::bar refers to, so it can parse the prototype correctly. However, your package->import() is a run-time statement, so perl can not tell at compile time that main::foo has a prototype.