After a quick skim, it looks pretty good to me, one comment on the SYNOPSIS though.
sub get_widget {
my ($self, $params) = @_;
unless (my_validation_function($params->{product_number})) {
REST_error('404', 'Invalid product_number');
}
my $widget = $widgets[$params->{product_number}];
if (REST_media_type eq 'text/plain') {
return $self->plain_output($widget);
}
return $self->fancy_output($widget);
}
Shouldn't the calls to
REST_error and
REST_media_type be method calls, and not function calls?
Also, I would suggest wrapping $params in an object as well. You might not need it now, but when you do, it will be a royal pain to go back and change all the legacy code. (give Class::Param a look, it seems to have lots of functionality available if/when you need it)