Declare packages outside of their block

Perl v5.14 gets a step closer to a saner way to declare classes with its new package NAME BLOCK syntax that lets you easily group everything that goes in a package.

Previously, to limit a package you had to declare the package inside the scope:

{
package Some::Class;
...
}

That ... is another v5.12 new feature, the yadda yadda operator. It’s a compilable placeholder for statements to come later.

Many people think that the package statement changes the scope, but it doesn’t (see Know what creates a scope). It doesn’t.

Now you can put the package statement outside the block so everything in the block is in that package:

use v5.14;

package Some::Class {
...
}

You can also add a version too, like the package NAME VERSION syntax that v5.12 added:

use v5.14;

package Some::Class 1.23 {
...
}

This even works with nested classes:

use v5.14;

package Local::foo {
	say "1. Package is " . __PACKAGE__;
	
	package Local::bar {
		say "2. Package is " . __PACKAGE__;
		}

	say "3. Package is " . __PACKAGE__;
	}

This is handy for small private classes that you don’t want to put in a separate file. That also means another part of the code can’t load it explicitly because there’s no file that maps to its package name. That class is not actually hidden; it’s merely obscure.

And, if your editor supports it, you can also fold the block that contains the package. But then you may be able to fold naked blocks as well.

Leave a comment

0 Comments.

Leave a Reply


[ Ctrl + Enter ]