severity=4

program-extensions = .pl .t

[TestingAndDebugging::RequireUseStrict]
equivalent_modules = Modern::Perl Moo Moose Object::Pad Test::Class::Moose Test2::V0 Test::Most common::sense

[TestingAndDebugging::RequireUseWarnings]
equivalent_modules = Modern::Perl Moo Moose Object::Pad Test::Class::Moose Test2::V0 Test::Most common::sense

# Gets confused with subroutine signatures
[-Subroutines::ProhibitSubroutinePrototypes]

# I like strict and warnings, but no strict and no warnings are intentional
[TestingAndDebugging::ProhibitNoStrict]
allow = vars subs refs

[-TestingAndDebugging::ProhibitNoWarnings]

# Surprisingly controversial policy, considering Community::EmptyReturn recommends the exact opposite.
[-Subroutines::ProhibitExplicitReturnUndef]

# I find code such as if($foo and !$bar) to be clear enough. 
[-ValuesAndExpressions::ProhibitMixedBooleanOperators]

# Constant is part of core and seems fairly popular
[-ValuesAndExpressions::ProhibitConstantPragma]

# Multiple packages in one file is bad form, but it's not a bug or unintentional
[-Modules::ProhibitMultiplePackages]

[-Subroutines::RequireFinalReturn]

# Object::Pad documentation has use Object::Pad as the first line of the module.
[Modules::RequireExplicitPackage]
allow_import_of = Object::Pad feature Feature::Compat::Class experimental

# Not a default policy, but these exemptions are useful. I'm sure many others exist as well. 
[Subroutines::ProhibitCallsToUndeclaredSubs]
exempt_subs = Object::Pad::class Object::Pad::field Object::Pad::role Object::Pad::has Object::Pad::param Object::Pad::reader Object::Pad::writer Object::Pad::mutator Object::Pad::accessor experimental::field experimental::class experimental::param feature::field feature::class feature::param Future::AsyncAwait::await Future::AsyncAwait::async feature::try feature::catch Feature::Compat::Try::try Feature::Compat::Try::catch