I've been using AnyEvent for about seven years now, and I am very glad that I toughed out the relatively steep learning curve and got my head wrapped around it. Though I can't honestly put a five in any of the given categories, I have to give it a five overall because it brings so much power and performance to bear.
I cannot speak to the functionality of AnyEvent when used by itself, so I am not leaving a rating. Please be aware however that despite its claims, it is the *least* compatible of the 4 major event loop ecosystems in Perl currently (POE, IO::Async, Mojo::IOLoop, and AnyEvent). The other three have many reactor backends as well, even including for EV, there is nothing special about AnyEvent in this regard. On top of that, it continues to throw a fatal error if used with the IO::Async adapter, with a quite ironic explanation: metacpan.org/source/MLEHMANN/AnyEvent...
I long ago accepted that any asynchronous framework supporting a language that wasn't meant to do that natively is going to demand that it's users write some strange code to make things work, perhaps duplicating processes that must be done sync or asynchronously as a consequence.
Since I came to AnyEvent after several years of happily and successfully using POE, I was comfortable with this idea.
I initially entertained the switch because I really wanted an async-friendly memcached library (which is, at this point, ironic, since in order to get one I had to write my own).
I ultimately chose to switch when I realized that through careful creation of wrappers and abstractions, I would be able to use the same code for network, LDAP, DBD::Pg and memcached throughout my application---the bits that were written to run in a high-performance async setting, and the bits that are just meant to be called from a Catalyst application.
Being able to refactor my application to reduce redundancy and increase consistency of behavior has been worth the learning curve, and I never could have done that with POE, because POE's demands that you conform your application to its structure are just too great.
I'm not saying AnyEvent necessarily makes this easy---it's a hard problem to solve---but it's doable.
The most perlish distribution I've seen for a long time
I'm using AnyEvent for around 2 years now. My modules Net::IRC3,
Net::XMPP2, AnyEvent::HTTPD (will soon be released) and Text::Edit
use it for their I/O events. It has been very stable for quite some
time now, and all bugs I occasionally found and reported have been fixed very quickly.
I also like that it doesn't enforce a framework upon me, like POE or
IO::Async would do. You just create some watchers for the events you
like, specify the callbacks and you are ready to go.
The documentation is a good reference and also comes with useful
examples. It's also very good that all quirks in the interface
are nicely documented. For example the exact behavior of C<wait>
I give 5 overall stars as it proved to be stable, is very easy
to use and I consider it a very good policy free alternative to
all other event frameworks.
1 hidden unhelpful review