Reviews by Eric Heimburg


Mail-Sendmail (0.79) *****

This is really straightforward. You can also configure it to do clever and unusual things thanks to the flexible headers-hash.

The off-site docs are very helpful for sending HTML email (which many of the smaller email modules can't handle very well, if at all).

Net-OSCAR (1.925) ****

This is easily the best of the AIM modules I've seen. The biggest flaw is the documentation, which is superficially complete, but has some broken links, inadequate cross-referencing, and some almost-but-not-quite-complete examples. It also neglected to mention that a feature wasn't actually implemented (using OSCAR_RATE_MANAGE_AUTO kills your program with a not-yet-finished error message). But still, I managed to get it to do everything I wanted it to, and I made it jump through some pretty tricky hoops without any bugs or surprises.

If you're doing something simple, this is very easy to use. The brief example in the docs will get you up and running in an instant.

If you're using AIM sockets in concert with other sockets, you'll need to know how to use select() the old-fashioned way, instead of using the more modern IO::Select(). The documentation has an ALMOST complete example of how to do this. Here's another example to help fill in the gaps -- it shows how to set up $rin and $win, and how to check them afterwards. It assumes you have an IO::Socket called $my_socket which you also want to select on. This might be a listening socket or a connected socket waiting for input.

my ($rin, $win, $ein);
my @oscar_filenos = $oscar->selector_filenos();

$rin = $oscar_filenos[0];
$win = $oscar_filenos[1];
$ein = $rin | $win;
vec($rin, $my_socket->fileno, 1) = 1;

select($rin, $win, $ein, undef);
$oscar->process_connections(\$rin, \$win, \$ein);

# Now $rin, $win, and $ein only have the file descriptors not
# associated with OSCAR objects in them - we can process our events.
if (vec($rin, $my_socket->fileno, 1)) {