My 2023 in Perl
2023 was a rather productive year for me on CPAN. Aided by taking some time off I managed to release a whopping 18 new modules.
Half of my new modules were related to my password framework
Crypt::Passphrase. To be honest most of them are either small (± 100 LOC) glue two or three other pieces of code together. And then there was
Crypt::HSM, a PKCS11 interface (to use cryptographic hardware without exposing cryptographic keys) that was probably more work (2600 LOC of XS) than the others combined.
Most of this was with the aim to add peppering support to
Crypt::Passphrase, a subject extensive enough that I should probably dedicate a separate blogpost to it.
ExtUtils::Typemaps::Magic contains a set of typemaps that help me write XS based objects. In particular the MagicExt typemap allows me to write thread-safe objects (in my particular case: refcounted), which no built-in typemap does.
App::typemap helps one integrate typemap bundles into your local typemap file, and
Dist::Zilla::Plugin::Typemap does the same for
I finally got around to publishing two pieces of toolchain that had been in the pipeline for years.
CPAN::Static contains a specification and reference implementation for static installation of modules in CPAN clients. For 90% of all dists, ExtUtils::MakeMaker and Module::Build are an overkill and all they really need is to copy some files and run tests.
CPAN::API::BuildPL, a specification for Build.PL implementations was mostly written by David Golden but never got published, but now CPAN::Static depends on it so was published alongside with it.
These two modules add a little typing to Perl.
Magic::Check implements runtime (type) checking on a variable, and
Magic::Coerce implements coercers. They're both really more low-level backend modules that beg for a wrapper with a better syntax that I haven't come up with yet.
This module brings Thread::CSP style channels to threads.pm as an alternative to
Thread::Queue. As its name indicates, its semantics are close to that of Go channels, instead of the more asynchronous behavior of
This is an implementation of a simpler and more predictable kind of smartmatching than the one that comes with core. It's intended to be usable even if smartmatching gets removed from core itself.
I had a productive year, and some pretty good leads to move forward this year. I'm looking forward to it.