diff --git a/Changes b/Changes
index 09d94fd..d38fbc2 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,23 @@
+0.631   2019-03-12 (PERLANCAR)
+
+	- Add method: handle().
+
+	- Add lock() option: mode.
+
+	- [doc] Mention sysopen() with O_CREAT|O_EXCL as an alternative to
+	  flock().
+
+
+0.630   2019-03-12 (PERLANCAR)
+
+	- No functional changes.
+
+	- [doc] Expand on why File::Flock is too heavyweight.
+
+	- [doc] Note about lock file removal in unlock() documentation,
+	  some POD formatting to make methods more linkable.
+
+
 0.62    2017-07-01 (PERLANCAR)
 
         - [doc] Format link with L<>.
diff --git a/LICENSE b/LICENSE
index 5866eff..cf21d7b 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-This software is copyright (c) 2017, 2015, 2014 by perlancar@cpan.org.
+This software is copyright (c) 2019, 2017, 2015, 2014 by perlancar@cpan.org.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -12,7 +12,7 @@ b) the "Artistic License"
 
 --- The GNU General Public License, Version 1, February 1989 ---
 
-This software is Copyright (c) 2017, 2015, 2014 by perlancar@cpan.org.
+This software is Copyright (c) 2019, 2017, 2015, 2014 by perlancar@cpan.org.
 
 This is free software, licensed under:
 
@@ -272,7 +272,7 @@ That's all there is to it!
 
 --- The Artistic License 1.0 ---
 
-This software is Copyright (c) 2017, 2015, 2014 by perlancar@cpan.org.
+This software is Copyright (c) 2019, 2017, 2015, 2014 by perlancar@cpan.org.
 
 This is free software, licensed under:
 
diff --git a/MANIFEST b/MANIFEST
index db4ba36..88b3b4a 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,4 +1,4 @@
-# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.007.
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.009.
 Changes
 LICENSE
 MANIFEST
@@ -10,6 +10,7 @@ dist.ini
 lib/File/Flock/Retry.pm
 t/00-compile.t
 t/01-basics.t
+t/author-critic.t
 t/author-pod-coverage.t
 t/author-pod-syntax.t
 weaver.ini
diff --git a/META.json b/META.json
index f92984e..c600760 100644
--- a/META.json
+++ b/META.json
@@ -4,7 +4,7 @@
       "perlancar <perlancar@cpan.org>"
    ],
    "dynamic_config" : 0,
-   "generated_by" : "Dist::Zilla version 6.007, CPAN::Meta::Converter version 2.150010",
+   "generated_by" : "Dist::Zilla version 6.009, CPAN::Meta::Converter version 2.150010",
    "license" : [
       "perl_5"
    ],
@@ -22,6 +22,7 @@
       "develop" : {
          "requires" : {
             "Pod::Coverage::TrustPod" : "0",
+            "Test::Perl::Critic" : "0",
             "Test::Pod" : "1.41",
             "Test::Pod::Coverage" : "1.08"
          }
@@ -59,10 +60,10 @@
          "web" : "https://github.com/perlancar/perl-File-Flock-Retry"
       }
    },
-   "version" : "0.62",
+   "version" : "0.631",
    "x_Dist_Zilla" : {
       "perl" : {
-         "version" : "5.024000"
+         "version" : "5.026000"
       },
       "plugins" : [
          {
@@ -79,52 +80,52 @@
                }
             },
             "name" : "@Author::PERLANCAR/@Filter/GatherDir",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::PruneCruft",
             "name" : "@Author::PERLANCAR/@Filter/PruneCruft",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::ManifestSkip",
             "name" : "@Author::PERLANCAR/@Filter/ManifestSkip",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaYAML",
             "name" : "@Author::PERLANCAR/@Filter/MetaYAML",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::License",
             "name" : "@Author::PERLANCAR/@Filter/License",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::PodCoverageTests",
             "name" : "@Author::PERLANCAR/@Filter/PodCoverageTests",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::PodSyntaxTests",
             "name" : "@Author::PERLANCAR/@Filter/PodSyntaxTests",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::ExtraTests",
             "name" : "@Author::PERLANCAR/@Filter/ExtraTests",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::ExecDir",
             "name" : "@Author::PERLANCAR/@Filter/ExecDir",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::ShareDir",
             "name" : "@Author::PERLANCAR/@Filter/ShareDir",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::MakeMaker",
@@ -134,53 +135,74 @@
                }
             },
             "name" : "@Author::PERLANCAR/@Filter/MakeMaker",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::Manifest",
             "name" : "@Author::PERLANCAR/@Filter/Manifest",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::ConfirmRelease",
             "name" : "@Author::PERLANCAR/@Filter/ConfirmRelease",
-            "version" : "6.007"
+            "version" : "6.009"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::ExecDir",
+            "name" : "@Author::PERLANCAR/ExecDir script",
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::PERLANCAR::BeforeBuild",
             "name" : "@Author::PERLANCAR/PERLANCAR::BeforeBuild",
-            "version" : "0.55"
+            "version" : "0.594"
          },
          {
             "class" : "Dist::Zilla::Plugin::Rinci::AbstractFromMeta",
             "name" : "@Author::PERLANCAR/Rinci::AbstractFromMeta",
-            "version" : "0.09"
+            "version" : "0.10"
          },
          {
             "class" : "Dist::Zilla::Plugin::PodnameFromFilename",
             "name" : "@Author::PERLANCAR/PodnameFromFilename",
-            "version" : "0.01"
+            "version" : "0.02"
          },
          {
             "class" : "Dist::Zilla::Plugin::PERLANCAR::EnsurePrereqToSpec",
             "name" : "@Author::PERLANCAR/PERLANCAR::EnsurePrereqToSpec",
-            "version" : "0.04"
+            "version" : "0.060"
          },
          {
             "class" : "Dist::Zilla::Plugin::PERLANCAR::MetaResources",
             "name" : "@Author::PERLANCAR/PERLANCAR::MetaResources",
-            "version" : "0.03"
+            "version" : "0.040"
          },
          {
             "class" : "Dist::Zilla::Plugin::CheckChangeLog",
             "name" : "@Author::PERLANCAR/CheckChangeLog",
-            "version" : "0.02"
+            "version" : "0.05"
          },
          {
             "class" : "Dist::Zilla::Plugin::CheckMetaResources",
             "name" : "@Author::PERLANCAR/CheckMetaResources",
             "version" : "0.001"
          },
+         {
+            "class" : "Dist::Zilla::Plugin::CheckSelfDependency",
+            "config" : {
+               "Dist::Zilla::Plugin::CheckSelfDependency" : {
+                  "finder" : [
+                     ":InstallModules"
+                  ]
+               },
+               "Dist::Zilla::Role::ModuleMetadata" : {
+                  "Module::Metadata" : "1.000033",
+                  "version" : "0.006"
+               }
+            },
+            "name" : "@Author::PERLANCAR/CheckSelfDependency",
+            "version" : "0.011"
+         },
          {
             "class" : "Dist::Zilla::Plugin::CopyrightYearFromGit",
             "name" : "@Author::PERLANCAR/CopyrightYearFromGit",
@@ -194,17 +216,12 @@
          {
             "class" : "Dist::Zilla::Plugin::MetaJSON",
             "name" : "@Author::PERLANCAR/MetaJSON",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaConfig",
             "name" : "@Author::PERLANCAR/MetaConfig",
-            "version" : "6.007"
-         },
-         {
-            "class" : "Dist::Zilla::Plugin::GenShellCompletion",
-            "name" : "@Author::PERLANCAR/GenShellCompletion",
-            "version" : "0.11"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::Authority",
@@ -238,67 +255,67 @@
                      {
                         "class" : "Pod::Weaver::Plugin::EnsurePod5",
                         "name" : "@CorePrep/EnsurePod5",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Plugin::H1Nester",
                         "name" : "@CorePrep/H1Nester",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Section::Name",
                         "name" : "@Author::PERLANCAR/Name",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Section::Version",
                         "name" : "@Author::PERLANCAR/Version",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Section::Region",
                         "name" : "@Author::PERLANCAR/prelude",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Section::Generic",
                         "name" : "SYNOPSIS",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Section::Generic",
                         "name" : "DESCRIPTION",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Section::Generic",
                         "name" : "OVERVIEW",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Section::Collect",
                         "name" : "ATTRIBUTES",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Section::Collect",
                         "name" : "METHODS",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Section::Collect",
                         "name" : "FUNCTIONS",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Section::Leftovers",
                         "name" : "@Author::PERLANCAR/Leftovers",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Section::Region",
                         "name" : "@Author::PERLANCAR/postlude",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Section::Completion::GetoptLongComplete",
@@ -333,17 +350,17 @@
                      {
                         "class" : "Pod::Weaver::Section::Authors",
                         "name" : "@Author::PERLANCAR/Authors",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Section::Legal",
                         "name" : "@Author::PERLANCAR/Legal",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Plugin::Rinci",
                         "name" : "@Author::PERLANCAR/Rinci",
-                        "version" : "0.76"
+                        "version" : "0.77"
                      },
                      {
                         "class" : "Pod::Weaver::Plugin::AppendPrepend",
@@ -353,12 +370,12 @@
                      {
                         "class" : "Pod::Weaver::Plugin::EnsureUniqueSections",
                         "name" : "@Author::PERLANCAR/EnsureUniqueSections",
-                        "version" : "0.121550"
+                        "version" : "0.163250"
                      },
                      {
                         "class" : "Pod::Weaver::Plugin::SingleEncoding",
                         "name" : "@Author::PERLANCAR/SingleEncoding",
-                        "version" : "4.014"
+                        "version" : "4.015"
                      },
                      {
                         "class" : "Pod::Weaver::Plugin::PERLANCAR::SortSections",
@@ -374,17 +391,17 @@
          {
             "class" : "Dist::Zilla::Plugin::PruneFiles",
             "name" : "@Author::PERLANCAR/PruneFiles",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
-            "class" : "Dist::Zilla::Plugin::ReadmeFromPod",
-            "name" : "@Author::PERLANCAR/ReadmeFromPod",
-            "version" : "0.35"
+            "class" : "Dist::Zilla::Plugin::Pod2Readme",
+            "name" : "@Author::PERLANCAR/Pod2Readme",
+            "version" : "0.004"
          },
          {
             "class" : "Dist::Zilla::Plugin::Rinci::AddPrereqs",
             "name" : "@Author::PERLANCAR/Rinci::AddPrereqs",
-            "version" : "0.13"
+            "version" : "0.142"
          },
          {
             "class" : "Dist::Zilla::Plugin::Rinci::AddToDb",
@@ -417,41 +434,58 @@
                   "script_finder" : [
                      ":PerlExecFiles"
                   ],
-                  "skips" : []
+                  "skips" : [],
+                  "switch" : []
                }
             },
             "name" : "@Author::PERLANCAR/Test::Compile",
-            "version" : "2.054"
+            "version" : "2.056"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::Test::Perl::Critic",
+            "name" : "@Author::PERLANCAR/Test::Perl::Critic",
+            "version" : "3.001"
          },
          {
             "class" : "Dist::Zilla::Plugin::Test::Rinci",
             "name" : "@Author::PERLANCAR/Test::Rinci",
-            "version" : "0.03"
+            "version" : "0.040"
          },
          {
-            "class" : "Dist::Zilla::Plugin::UploadToCPAN::WWWPAUSESimple",
-            "name" : "@Author::PERLANCAR/UploadToCPAN::WWWPAUSESimple",
-            "version" : "0.04"
+            "class" : "Dist::Zilla::Plugin::StaticInstall",
+            "config" : {
+               "Dist::Zilla::Plugin::StaticInstall" : {
+                  "dry_run" : 0,
+                  "mode" : "on"
+               }
+            },
+            "name" : "@Author::PERLANCAR/StaticInstall",
+            "version" : "0.010"
          },
          {
             "class" : "Dist::Zilla::Plugin::EnsureSQLSchemaVersionedTest",
             "name" : "@Author::PERLANCAR/EnsureSQLSchemaVersionedTest",
-            "version" : "0.02"
+            "version" : "0.03"
          },
          {
-            "class" : "Dist::Zilla::Plugin::Acme::CPANLists::Blacklist",
-            "name" : "@Author::PERLANCAR/Acme::CPANLists::Blacklist",
-            "version" : "0.02"
+            "class" : "Dist::Zilla::Plugin::Acme::CPANModules::Blacklist",
+            "name" : "@Author::PERLANCAR/Acme::CPANModules::Blacklist",
+            "version" : "0.001"
          },
          {
             "class" : "Dist::Zilla::Plugin::Prereqs::EnsureVersion",
             "name" : "@Author::PERLANCAR/Prereqs::EnsureVersion",
-            "version" : "0.01"
+            "version" : "0.050"
          },
          {
             "class" : "Dist::Zilla::Plugin::Prereqs::CheckCircular",
             "name" : "@Author::PERLANCAR/Prereqs::CheckCircular",
-            "version" : "0.003"
+            "version" : "0.006"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::UploadToCPAN::WWWPAUSESimple",
+            "name" : "@Author::PERLANCAR/UploadToCPAN::WWWPAUSESimple",
+            "version" : "0.04"
          },
          {
             "class" : "Dist::Zilla::Plugin::Prereqs",
@@ -462,7 +496,7 @@
                }
             },
             "name" : "TestRequires",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::Prereqs",
@@ -473,57 +507,57 @@
                }
             },
             "name" : "Prereqs",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":InstallModules",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":IncModules",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":TestFiles",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":ExtraTestFiles",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":ExecFiles",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":PerlExecFiles",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":ShareFiles",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":MainModule",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":AllFiles",
-            "version" : "6.007"
+            "version" : "6.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":NoFiles",
-            "version" : "6.007"
+            "version" : "6.009"
          }
       ],
       "zilla" : {
@@ -531,10 +565,11 @@
          "config" : {
             "is_trial" : 0
          },
-         "version" : "6.007"
+         "version" : "6.009"
       }
    },
    "x_authority" : "cpan:PERLANCAR",
-   "x_serialization_backend" : "Cpanel::JSON::XS version 3.0217"
+   "x_serialization_backend" : "Cpanel::JSON::XS version 3.0233",
+   "x_static_install" : 1
 }
 
diff --git a/META.yml b/META.yml
index 97d0a96..17a4246 100644
--- a/META.yml
+++ b/META.yml
@@ -14,7 +14,7 @@ build_requires:
 configure_requires:
   ExtUtils::MakeMaker: '0'
 dynamic_config: 0
-generated_by: 'Dist::Zilla version 6.007, CPAN::Meta::Converter version 2.150010'
+generated_by: 'Dist::Zilla version 6.009, CPAN::Meta::Converter version 2.150010'
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -29,10 +29,10 @@ resources:
   bugtracker: https://rt.cpan.org/Public/Dist/Display.html?Name=File-Flock-Retry
   homepage: https://metacpan.org/release/File-Flock-Retry
   repository: git://github.com/perlancar/perl-File-Flock-Retry.git
-version: '0.62'
+version: '0.631'
 x_Dist_Zilla:
   perl:
-    version: '5.024000'
+    version: '5.026000'
   plugins:
     -
       class: Dist::Zilla::Plugin::GatherDir
@@ -46,86 +46,101 @@ x_Dist_Zilla:
           prune_directory: []
           root: .
       name: '@Author::PERLANCAR/@Filter/GatherDir'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::PruneCruft
       name: '@Author::PERLANCAR/@Filter/PruneCruft'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::ManifestSkip
       name: '@Author::PERLANCAR/@Filter/ManifestSkip'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::MetaYAML
       name: '@Author::PERLANCAR/@Filter/MetaYAML'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::License
       name: '@Author::PERLANCAR/@Filter/License'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::PodCoverageTests
       name: '@Author::PERLANCAR/@Filter/PodCoverageTests'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::PodSyntaxTests
       name: '@Author::PERLANCAR/@Filter/PodSyntaxTests'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::ExtraTests
       name: '@Author::PERLANCAR/@Filter/ExtraTests'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::ExecDir
       name: '@Author::PERLANCAR/@Filter/ExecDir'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::ShareDir
       name: '@Author::PERLANCAR/@Filter/ShareDir'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::MakeMaker
       config:
         Dist::Zilla::Role::TestRunner:
           default_jobs: 1
       name: '@Author::PERLANCAR/@Filter/MakeMaker'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::Manifest
       name: '@Author::PERLANCAR/@Filter/Manifest'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::ConfirmRelease
       name: '@Author::PERLANCAR/@Filter/ConfirmRelease'
-      version: '6.007'
+      version: '6.009'
+    -
+      class: Dist::Zilla::Plugin::ExecDir
+      name: '@Author::PERLANCAR/ExecDir script'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::PERLANCAR::BeforeBuild
       name: '@Author::PERLANCAR/PERLANCAR::BeforeBuild'
-      version: '0.55'
+      version: '0.594'
     -
       class: Dist::Zilla::Plugin::Rinci::AbstractFromMeta
       name: '@Author::PERLANCAR/Rinci::AbstractFromMeta'
-      version: '0.09'
+      version: '0.10'
     -
       class: Dist::Zilla::Plugin::PodnameFromFilename
       name: '@Author::PERLANCAR/PodnameFromFilename'
-      version: '0.01'
+      version: '0.02'
     -
       class: Dist::Zilla::Plugin::PERLANCAR::EnsurePrereqToSpec
       name: '@Author::PERLANCAR/PERLANCAR::EnsurePrereqToSpec'
-      version: '0.04'
+      version: '0.060'
     -
       class: Dist::Zilla::Plugin::PERLANCAR::MetaResources
       name: '@Author::PERLANCAR/PERLANCAR::MetaResources'
-      version: '0.03'
+      version: '0.040'
     -
       class: Dist::Zilla::Plugin::CheckChangeLog
       name: '@Author::PERLANCAR/CheckChangeLog'
-      version: '0.02'
+      version: '0.05'
     -
       class: Dist::Zilla::Plugin::CheckMetaResources
       name: '@Author::PERLANCAR/CheckMetaResources'
       version: '0.001'
+    -
+      class: Dist::Zilla::Plugin::CheckSelfDependency
+      config:
+        Dist::Zilla::Plugin::CheckSelfDependency:
+          finder:
+            - ':InstallModules'
+        Dist::Zilla::Role::ModuleMetadata:
+          Module::Metadata: '1.000033'
+          version: '0.006'
+      name: '@Author::PERLANCAR/CheckSelfDependency'
+      version: '0.011'
     -
       class: Dist::Zilla::Plugin::CopyrightYearFromGit
       name: '@Author::PERLANCAR/CopyrightYearFromGit'
@@ -137,15 +152,11 @@ x_Dist_Zilla:
     -
       class: Dist::Zilla::Plugin::MetaJSON
       name: '@Author::PERLANCAR/MetaJSON'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::MetaConfig
       name: '@Author::PERLANCAR/MetaConfig'
-      version: '6.007'
-    -
-      class: Dist::Zilla::Plugin::GenShellCompletion
-      name: '@Author::PERLANCAR/GenShellCompletion'
-      version: '0.11'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::Authority
       name: '@Author::PERLANCAR/Authority'
@@ -173,55 +184,55 @@ x_Dist_Zilla:
             -
               class: Pod::Weaver::Plugin::EnsurePod5
               name: '@CorePrep/EnsurePod5'
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Plugin::H1Nester
               name: '@CorePrep/H1Nester'
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Section::Name
               name: '@Author::PERLANCAR/Name'
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Section::Version
               name: '@Author::PERLANCAR/Version'
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Section::Region
               name: '@Author::PERLANCAR/prelude'
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Section::Generic
               name: SYNOPSIS
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Section::Generic
               name: DESCRIPTION
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Section::Generic
               name: OVERVIEW
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Section::Collect
               name: ATTRIBUTES
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Section::Collect
               name: METHODS
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Section::Collect
               name: FUNCTIONS
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Section::Leftovers
               name: '@Author::PERLANCAR/Leftovers'
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Section::Region
               name: '@Author::PERLANCAR/postlude'
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Section::Completion::GetoptLongComplete
               name: '@Author::PERLANCAR/Completion::GetoptLongComplete'
@@ -249,15 +260,15 @@ x_Dist_Zilla:
             -
               class: Pod::Weaver::Section::Authors
               name: '@Author::PERLANCAR/Authors'
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Section::Legal
               name: '@Author::PERLANCAR/Legal'
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Plugin::Rinci
               name: '@Author::PERLANCAR/Rinci'
-              version: '0.76'
+              version: '0.77'
             -
               class: Pod::Weaver::Plugin::AppendPrepend
               name: '@Author::PERLANCAR/AppendPrepend'
@@ -265,11 +276,11 @@ x_Dist_Zilla:
             -
               class: Pod::Weaver::Plugin::EnsureUniqueSections
               name: '@Author::PERLANCAR/EnsureUniqueSections'
-              version: '0.121550'
+              version: '0.163250'
             -
               class: Pod::Weaver::Plugin::SingleEncoding
               name: '@Author::PERLANCAR/SingleEncoding'
-              version: '4.014'
+              version: '4.015'
             -
               class: Pod::Weaver::Plugin::PERLANCAR::SortSections
               name: '@Author::PERLANCAR/PERLANCAR::SortSections'
@@ -279,15 +290,15 @@ x_Dist_Zilla:
     -
       class: Dist::Zilla::Plugin::PruneFiles
       name: '@Author::PERLANCAR/PruneFiles'
-      version: '6.007'
+      version: '6.009'
     -
-      class: Dist::Zilla::Plugin::ReadmeFromPod
-      name: '@Author::PERLANCAR/ReadmeFromPod'
-      version: '0.35'
+      class: Dist::Zilla::Plugin::Pod2Readme
+      name: '@Author::PERLANCAR/Pod2Readme'
+      version: '0.004'
     -
       class: Dist::Zilla::Plugin::Rinci::AddPrereqs
       name: '@Author::PERLANCAR/Rinci::AddPrereqs'
-      version: '0.13'
+      version: '0.142'
     -
       class: Dist::Zilla::Plugin::Rinci::AddToDb
       name: '@Author::PERLANCAR/Rinci::AddToDb'
@@ -315,32 +326,45 @@ x_Dist_Zilla:
           script_finder:
             - ':PerlExecFiles'
           skips: []
+          switch: []
       name: '@Author::PERLANCAR/Test::Compile'
-      version: '2.054'
+      version: '2.056'
+    -
+      class: Dist::Zilla::Plugin::Test::Perl::Critic
+      name: '@Author::PERLANCAR/Test::Perl::Critic'
+      version: '3.001'
     -
       class: Dist::Zilla::Plugin::Test::Rinci
       name: '@Author::PERLANCAR/Test::Rinci'
-      version: '0.03'
+      version: '0.040'
     -
-      class: Dist::Zilla::Plugin::UploadToCPAN::WWWPAUSESimple
-      name: '@Author::PERLANCAR/UploadToCPAN::WWWPAUSESimple'
-      version: '0.04'
+      class: Dist::Zilla::Plugin::StaticInstall
+      config:
+        Dist::Zilla::Plugin::StaticInstall:
+          dry_run: 0
+          mode: on
+      name: '@Author::PERLANCAR/StaticInstall'
+      version: '0.010'
     -
       class: Dist::Zilla::Plugin::EnsureSQLSchemaVersionedTest
       name: '@Author::PERLANCAR/EnsureSQLSchemaVersionedTest'
-      version: '0.02'
+      version: '0.03'
     -
-      class: Dist::Zilla::Plugin::Acme::CPANLists::Blacklist
-      name: '@Author::PERLANCAR/Acme::CPANLists::Blacklist'
-      version: '0.02'
+      class: Dist::Zilla::Plugin::Acme::CPANModules::Blacklist
+      name: '@Author::PERLANCAR/Acme::CPANModules::Blacklist'
+      version: '0.001'
     -
       class: Dist::Zilla::Plugin::Prereqs::EnsureVersion
       name: '@Author::PERLANCAR/Prereqs::EnsureVersion'
-      version: '0.01'
+      version: '0.050'
     -
       class: Dist::Zilla::Plugin::Prereqs::CheckCircular
       name: '@Author::PERLANCAR/Prereqs::CheckCircular'
-      version: '0.003'
+      version: '0.006'
+    -
+      class: Dist::Zilla::Plugin::UploadToCPAN::WWWPAUSESimple
+      name: '@Author::PERLANCAR/UploadToCPAN::WWWPAUSESimple'
+      version: '0.04'
     -
       class: Dist::Zilla::Plugin::Prereqs
       config:
@@ -348,7 +372,7 @@ x_Dist_Zilla:
           phase: test
           type: requires
       name: TestRequires
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::Prereqs
       config:
@@ -356,51 +380,52 @@ x_Dist_Zilla:
           phase: runtime
           type: requires
       name: Prereqs
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':InstallModules'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':IncModules'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':TestFiles'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':ExtraTestFiles'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':ExecFiles'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':PerlExecFiles'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':ShareFiles'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':MainModule'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':AllFiles'
-      version: '6.007'
+      version: '6.009'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':NoFiles'
-      version: '6.007'
+      version: '6.009'
   zilla:
     class: Dist::Zilla::Dist::Builder
     config:
       is_trial: '0'
-    version: '6.007'
+    version: '6.009'
 x_authority: cpan:PERLANCAR
-x_serialization_backend: 'YAML::Tiny version 1.69'
+x_serialization_backend: 'YAML::Tiny version 1.70'
+x_static_install: 1
diff --git a/Makefile.PL b/Makefile.PL
index d8259f9..b120eba 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -1,4 +1,4 @@
-# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.007.
+# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.009.
 use strict;
 use warnings;
 
@@ -31,7 +31,7 @@ my %WriteMakefileArgs = (
     "IPC::Open3" => 0,
     "Test::More" => "0.98"
   },
-  "VERSION" => "0.62",
+  "VERSION" => "0.631",
   "test" => {
     "TESTS" => "t/*.t"
   }
diff --git a/README b/README
index 16f7229..5623719 100644
--- a/README
+++ b/README
@@ -1,72 +1,136 @@
-SYNOPSIS
+NAME
+    File::Flock::Retry - Yet another flock module
+
+VERSION
+    This document describes version 0.631 of File::Flock::Retry (from Perl
+    distribution File-Flock-Retry), released on 2019-03-12.
 
+SYNOPSIS
      use File::Flock::Retry;
-    
+
      # try to acquire exclusive lock. if fail to acquire lock within 60s, die.
      my $lock = File::Flock::Retry->lock($file);
-    
+
      # explicitly unlock
      $lock->release;
-    
+
      # automatically unlock if object is DESTROY-ed.
      undef $lock;
 
 DESCRIPTION
-
     This is yet another flock module. It is a more lightweight alternative
     to File::Flock with some other differences:
 
-      * OO interface only
+    *   OO interface only
 
-      * Autoretry (by default for 60s) when trying to acquire lock
+    *   Autoretry (by default for 60s) when trying to acquire lock
 
-      I prefer this approach to blocking/waiting indefinitely or failing
-      immediately.
+        I prefer this approach to blocking/waiting indefinitely or failing
+        immediately.
+
+CAVEATS
+    Not yet tested on Windows. Some filesystems do not support inode?
 
 METHODS
+  lock
+    Usage:
 
- $lock = File::Flock::Retry->lock($path, \%opts)
+     $lock = File::Flock::Retry->lock($path, \%opts)
 
-    Attempt to acquire an exclusive lock on $path. $path will be created if
-    not already exists. If $path is already locked by another process, will
-    retry every second for a number of seconds (by default 60). Will die if
-    failed to acquire lock after all retries.
+    Attempt to acquire an exclusive lock on $path. By default, $path will be
+    created if not already exists (see "mode"). If $path is already locked
+    by another process, will retry every second for a number of seconds (by
+    default 60). Will die if failed to acquire lock after all retries.
 
     Will automatically unlock if $lock goes out of scope. Upon unlock, will
-    remove $path if it was created and is still empty (this behavior is the
-    same as File::Flock).
+    remove $path if it was created by "lock" and is still empty (this
+    behavior is the same as "File::Flock").
 
     Available options:
 
-      * retries => int (default: 60)
+    *   mode
 
-      Number of retries (equals number of seconds, since retry is done
-      every second).
+        Integer. Default: O_CREAT | O_RDWR.
 
-      * shared => bool (default: 0)
+        File open mode, to be passed to Perl's "sysopen()". For example, if
+        you want to avoid race condition between creating and locking the
+        file, you might want to use "O_CREAT | O_EXCL | O_RDWR" to fail when
+        the file already exists. Note that the constants are available after
+        you do a "use Fcntl ':DEFAULT';".
 
-      By default, an exclusive lock (LOCK_EX) is attempted. However, if
-      this option is set to true, a shared lock (LOCK_SH) is attempted.
+    *   retries
 
- $lock->unlock
+        Integer. Default: 60.
 
-    Unlock.
+        Number of retries (equals number of seconds, since retry is done
+        every second).
 
- $lock->release
+    *   shared
 
-    Synonym for unlock().
+        Boolean. Default: 0.
 
-CAVEATS
+        By default, an exclusive lock (LOCK_EX) is attempted. However, if
+        this option is set to true, a shared lock (LOCK_SH) is attempted.
 
-    Not yet tested on Windows. Some filesystems do not support inode?
+  unlock
+    Usage:
 
-SEE ALSO
+     $lock->unlock
+
+    Unlock. will remove lock file if it was created by "lock" and is still
+    empty (this behavior is the same as "File::Flock").
+
+  release
+    Usage:
 
-    File::Flock
+     $lock->release
+
+    Synonym for "unlock".
+
+  handle
+    Usage:
+
+     my $fh = $lock->handle;
+
+    Return the file handle.
+
+HOMEPAGE
+    Please visit the project's homepage at
+    <https://metacpan.org/release/File-Flock-Retry>.
+
+SOURCE
+    Source repository is at
+    <https://github.com/perlancar/perl-File-Flock-Retry>.
+
+BUGS
+    Please report any bugs or feature requests on the bugtracker website
+    <https://rt.cpan.org/Public/Dist/Display.html?Name=File-Flock-Retry>
+
+    When submitting a bug or request, please include a test-file or a patch
+    to an existing test-file that illustrates the bug or desired feature.
+
+SEE ALSO
+    File::Flock, a bit too heavy in terms of dependencies and startup
+    overhead, for my taste. It depends on things like File::Slurp and
+    Data::Structure::Util (which loads Digest::MD5, Storable, among others).
 
     File::Flock::Tiny which is also tiny, but does not have the autoremove
     and autoretry capability which I want. See also:
-    https://github.com/trinitum/perl-File-Flock-Tiny/issues/1
+    <https://github.com/trinitum/perl-File-Flock-Tiny/issues/1>
 
     flock() Perl function.
 
+    An alternative to flock() is just using sysopen() with O_CREAT|O_EXCL
+    mode to create lock files. This is supported on more filesystems
+    (particularly network filesystems which lack flock()).
+
+AUTHOR
+    perlancar <perlancar@cpan.org>
+
+COPYRIGHT AND LICENSE
+    This software is copyright (c) 2019, 2017, 2015, 2014 by
+    perlancar@cpan.org.
+
+    This is free software; you can redistribute it and/or modify it under
+    the same terms as the Perl 5 programming language system itself.
+
diff --git a/debian/changelog b/debian/changelog
index de2d7ba..1340cbd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-libfile-flock-retry-perl (0.62-2) UNRELEASED; urgency=medium
+libfile-flock-retry-perl (0.631-1) UNRELEASED; urgency=medium
 
   [ Damyan Ivanov ]
   * declare conformance with Policy 4.1.3 (no changes needed)
@@ -6,7 +6,10 @@ libfile-flock-retry-perl (0.62-2) UNRELEASED; urgency=medium
   [ Salvatore Bonaccorso ]
   * Update Vcs-* headers for switch to salsa.debian.org
 
- -- Damyan Ivanov <dmn@debian.org>  Sun, 03 Dec 2017 22:44:37 +0000
+  [ Debian Janitor ]
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Fri, 12 Jul 2019 12:43:19 +0000
 
 libfile-flock-retry-perl (0.62-1) unstable; urgency=medium
 
diff --git a/dist.ini b/dist.ini
index 2da4ef6..712bdc6 100644
--- a/dist.ini
+++ b/dist.ini
@@ -1,9 +1,9 @@
-version = 0.62
+version = 0.631
 
 name    = File-Flock-Retry
 
 [@Author::PERLANCAR]
-:version=0.55
+:version=0.594
 
 [Prereqs / TestRequires]
 Cwd=0
@@ -18,4 +18,3 @@ perl=5.010001
 strict=0
 warnings=0
 Fcntl=0
-
diff --git a/lib/File/Flock/Retry.pm b/lib/File/Flock/Retry.pm
index 469a6a9..56b7c53 100644
--- a/lib/File/Flock/Retry.pm
+++ b/lib/File/Flock/Retry.pm
@@ -1,13 +1,13 @@
 package File::Flock::Retry;
 
-our $DATE = '2017-07-01'; # DATE
-our $VERSION = '0.62'; # VERSION
+our $DATE = '2019-03-12'; # DATE
+our $VERSION = '0.631'; # VERSION
 
 use 5.010001;
 use strict;
 use warnings;
 
-use Fcntl ':flock';
+use Fcntl ':DEFAULT', ':flock';
 
 sub lock {
     my ($class, $path, $opts) = @_;
@@ -18,6 +18,7 @@ sub lock {
     $h{path}    = $path;
     $h{retries} = $opts->{retries} // 60;
     $h{shared}  = $opts->{shared} // 0;
+    $h{mode}    = $opts->{mode} // (O_CREAT | O_RDWR);
 
     my $self = bless \%h, $class;
     $self->_lock;
@@ -40,7 +41,7 @@ sub _lock {
         $tries++;
 
         # 1
-        open $self->{_fh}, ">>", $path
+        sysopen $self->{_fh}, $path, $self->{mode}
             or die "Can't open lock file '$path': $!";
 
         # 2
@@ -107,6 +108,11 @@ sub unlock {
     $self->_unlock;
 }
 
+sub handle {
+    my $self = shift;
+    $self->{_fh};
+}
+
 sub DESTROY {
     my $self = shift;
     $self->_unlock;
@@ -127,7 +133,7 @@ File::Flock::Retry - Yet another flock module
 
 =head1 VERSION
 
-This document describes version 0.62 of File::Flock::Retry (from Perl distribution File-Flock-Retry), released on 2017-07-01.
+This document describes version 0.631 of File::Flock::Retry (from Perl distribution File-Flock-Retry), released on 2019-03-12.
 
 =head1 SYNOPSIS
 
@@ -165,39 +171,73 @@ Not yet tested on Windows. Some filesystems do not support inode?
 
 =head1 METHODS
 
-=head2 $lock = File::Flock::Retry->lock($path, \%opts)
+=head2 lock
+
+Usage:
+
+ $lock = File::Flock::Retry->lock($path, \%opts)
 
-Attempt to acquire an exclusive lock on C<$path>. C<$path> will be created if
-not already exists. If $path is already locked by another process, will retry
-every second for a number of seconds (by default 60). Will die if failed to
-acquire lock after all retries.
+Attempt to acquire an exclusive lock on C<$path>. By default, C<$path> will be
+created if not already exists (see L</mode>). If C<$path> is already locked by
+another process, will retry every second for a number of seconds (by default
+60). Will die if failed to acquire lock after all retries.
 
 Will automatically unlock if C<$lock> goes out of scope. Upon unlock, will
-remove C<$path> if it was created and is still empty (this behavior is the same
-as C<File::Flock>).
+remove C<$path> if it was created by L</lock> and is still empty (this behavior
+is the same as C<File::Flock>).
 
 Available options:
 
 =over
 
-=item * retries => int (default: 60)
+=item * mode
+
+Integer. Default: O_CREAT | O_RDWR.
+
+File open mode, to be passed to Perl's C<sysopen()>. For example, if you want to
+avoid race condition between creating and locking the file, you might want to
+use C<< O_CREAT | O_EXCL | O_RDWR >> to fail when the file already exists. Note
+that the constants are available after you do a C<< use Fcntl ':DEFAULT'; >>.
+
+=item * retries
+
+Integer. Default: 60.
 
 Number of retries (equals number of seconds, since retry is done every second).
 
-=item * shared => bool (default: 0)
+=item * shared
+
+Boolean. Default: 0.
 
 By default, an exclusive lock (LOCK_EX) is attempted. However, if this option is
 set to true, a shared lock (LOCK_SH) is attempted.
 
 =back
 
-=head2 $lock->unlock
+=head2 unlock
 
-Unlock.
+Usage:
 
-=head2 $lock->release
+ $lock->unlock
 
-Synonym for C<unlock()>.
+Unlock. will remove lock file if it was created by L</lock> and is still empty
+(this behavior is the same as C<File::Flock>).
+
+=head2 release
+
+Usage:
+
+ $lock->release
+
+Synonym for L</unlock>.
+
+=head2 handle
+
+Usage:
+
+ my $fh = $lock->handle;
+
+Return the file handle.
 
 =head1 HOMEPAGE
 
@@ -217,7 +257,10 @@ feature.
 
 =head1 SEE ALSO
 
-L<File::Flock>
+L<File::Flock>, a bit too heavy in terms of dependencies and startup overhead,
+for my taste. It depends on things like L<File::Slurp> and
+L<Data::Structure::Util> (which loads L<Digest::MD5>, L<Storable>, among
+others).
 
 L<File::Flock::Tiny> which is also tiny, but does not have the autoremove and
 autoretry capability which I want. See also:
@@ -225,13 +268,17 @@ L<https://github.com/trinitum/perl-File-Flock-Tiny/issues/1>
 
 flock() Perl function.
 
+An alternative to flock() is just using sysopen() with O_CREAT|O_EXCL mode to
+create lock files. This is supported on more filesystems (particularly network
+filesystems which lack flock()).
+
 =head1 AUTHOR
 
 perlancar <perlancar@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2017, 2015, 2014 by perlancar@cpan.org.
+This software is copyright (c) 2019, 2017, 2015, 2014 by perlancar@cpan.org.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
diff --git a/t/00-compile.t b/t/00-compile.t
index c6cfd3c..5c5938d 100644
--- a/t/00-compile.t
+++ b/t/00-compile.t
@@ -2,7 +2,7 @@ use 5.006;
 use strict;
 use warnings;
 
-# this test was generated with Dist::Zilla::Plugin::Test::Compile 2.054
+# this test was generated with Dist::Zilla::Plugin::Test::Compile 2.056
 
 use Test::More;
 
@@ -16,7 +16,9 @@ my @module_files = (
 
 # no fake home requested
 
-my $inc_switch = -d 'blib' ? '-Mblib' : '-Ilib';
+my @switches = (
+    -d 'blib' ? '-Mblib' : '-Ilib',
+);
 
 use File::Spec;
 use IPC::Open3;
@@ -30,7 +32,11 @@ for my $lib (@module_files)
     # see L<perlfaq8/How can I capture STDERR from an external command?>
     my $stderr = IO::Handle->new;
 
-    my $pid = open3($stdin, '>&STDERR', $stderr, $^X, $inc_switch, '-e', "require q[$lib]");
+    diag('Running: ', join(', ', map { my $str = $_; $str =~ s/'/\\'/g; q{'} . $str . q{'} }
+            $^X, @switches, '-e', "require q[$lib]"))
+        if $ENV{PERL_COMPILE_TEST_DEBUG};
+
+    my $pid = open3($stdin, '>&STDERR', $stderr, $^X, @switches, '-e', "require q[$lib]");
     binmode $stderr, ':crlf' if $^O eq 'MSWin32';
     my @_warnings = <$stderr>;
     waitpid($pid, 0);
diff --git a/t/author-critic.t b/t/author-critic.t
new file mode 100644
index 0000000..22becf1
--- /dev/null
+++ b/t/author-critic.t
@@ -0,0 +1,15 @@
+#!perl
+
+BEGIN {
+  unless ($ENV{AUTHOR_TESTING}) {
+    print qq{1..0 # SKIP these tests are for testing by the author\n};
+    exit
+  }
+}
+
+
+use strict;
+use warnings;
+
+use Test::Perl::Critic (-profile => "perlcritic.rc") x!! -e "perlcritic.rc";
+all_critic_ok();
diff --git a/t/author-pod-coverage.t b/t/author-pod-coverage.t
index 463d8eb..243340f 100644
--- a/t/author-pod-coverage.t
+++ b/t/author-pod-coverage.t
@@ -2,7 +2,7 @@
 
 BEGIN {
   unless ($ENV{AUTHOR_TESTING}) {
-    print "1..0 # SKIP these tests are for testing by the author\n";
+    print qq{1..0 # SKIP these tests are for testing by the author\n};
     exit
   }
 }
diff --git a/t/author-pod-syntax.t b/t/author-pod-syntax.t
index 858ff45..2233af0 100644
--- a/t/author-pod-syntax.t
+++ b/t/author-pod-syntax.t
@@ -2,7 +2,7 @@
 
 BEGIN {
   unless ($ENV{AUTHOR_TESTING}) {
-    print "1..0 # SKIP these tests are for testing by the author\n";
+    print qq{1..0 # SKIP these tests are for testing by the author\n};
     exit
   }
 }