The long awaited new version of Dancer2 is finally on its way to CPAN mirror near you!

Why did it take so long, what's changed, and why the big bump in version?

In short: A new plugin system, reworked from scratch, that is still (mostly) backwards compatible.

The plugin system

One of the sore points left in Dancer2 is its plugin architecture. The idea was to have an easy, comfortable plugin system (similar to Dancer 1) but much smarter. Unfortunately while the idea was there, and some of the code was there, the goals were not fully achieved, due to tuit shortage.

This led to various problems with plugins, most notably, using plugins within other plugins. This was beyond frustrating for several plugin developers. The current system was simply insufficient. We decided to finally tackle this. I have an entire story about that, but I'll leave it for another time.

The new plugin system provides each plugin with its own instance, full Moo classes (use attributes, roles, other plugins, whatever you want), full access to the internal objects (which, as a plugin developer, you might as well use), and cleanly decouples it from the user namespace. Despite it being object oriented, we still carefully try and handle the old keyword-based interface that the previous plugin system used. In places where it was not possible, we contacted the module authors, and provided pull requests to implement the new parts. We even collected statistics on which modules are supported, whether we submitted a PR, whether it was merged, and whether a new release was made. You can see this here.

The compatibility layer was incredibly involved and tasking and took several good developers, and myself, to get it done. Damien Krotkine (dams) even came back from semi-retirement just to help remove AUTOLOAD usage. He was missed. :)

Peter Mottram has worked tirelessly to get everything running as smooth as possible. He tracked everything, debugged, tested, submitted PRs, contacted and worked with authors, and basically did the work of about 20 people at once.

New core plugin

A beautiful gem that was a result of the second Dancer Conference (DancerConf), Dancer2::Plugin::SendAs is now in core! Most people do not know about it. It allows you to override the serializer (or the lack thereof) per response.

Well, that's not really true. The truth is that we introduced a stronger version of it with more features!

New keywords

The original keyword spec for Dancer and Dancer2 included header and push_header . This is only for response, not request. We now introduced variations explicitly for request and response, namely request_header and response_header (and more).

Megasplat fix

We fixed a problem with Megasplat, reported by Miyagawa-san.

Plack support

We support new Plack versions, a breakage that we marked as a mandatory high-priority issue.

A bit faster

We've internally moved to Type::Tiny which will automatically load Type::Tiny::XS, making your program faster.

We also moved from Class::Load to Module::Runtime to both reduce dependencies and speed up the framework.

There had been quite a few more improvements and we would like to thank everyone who helped make this release such a great one. You can view all the changes in the Changes log.

Onwards

Now that we got the new plugin architecture out of the way, we can start concentrating on additional improvements and interesting changes. We will introduce a completely reworked documentation, named routes (or route aliases), and maybe a rainbow-colored pony which sneezes sunshine.

With much love, The Dancer Core Team.