The module does its job in a basic way but doing serious work with it is frustrating. I have made heavy use of the module in Locale::XGettext and that really made me dream of a modern alternative to Locale::PO.
The class method "load_file_ashash" (yes, "ashash" is not a typo!) predates message contexts in PO files. Do not use it! You will lose data! This cannot be fixed. You should just be aware of it.
The central methods "msgid()", "msgstr()", etc. receive an unquoted string argument when invoked as a setter but return the quoted argument, when invoked as a getter. This surprising behavior makes working with the module cumbersome and inefficient.
Prepending the named arguments in the constructor with hyphens is so much 1995! The hyphens should at least be optional.
There is almost no consistency checking. The module lets you happily create PO entries without a msgid. There are no high-level methods for manipulating the PO header of a file. There are no methods for merging two PO entries (crucial for the creation of a PO file).
Last but not least, the interface for creating a PO entry with plural forms is really awkward and not well documented.
As I said in the beginning, the module does its job (when used the right way). A lot of people have improved the module over the years, so that it now also supports newer PO features like message contexts or plural forms. But the design problems of Locale::PO cannot be fixed.