package FormValidator::Lite::Upload; use strict; use warnings; use Carp (); use Scalar::Util qw/blessed/; { my %cache; sub _load { my $pkg = shift; unless ($cache{$pkg}++) { eval "use $pkg"; ## no critic Carp::croak($@) if $@; } $pkg; } } sub new { my ($self, $q, $name) = @_; Carp::croak("missing parameter \$name") unless $name; Carp::croak("\$q is not a object") unless blessed $q; my $pkg = do { if ($q->isa('CGI')) { 'CGI'; } elsif ($q->isa('HTTP::Engine::Request')) { 'HTTPEngine'; } elsif ($q->isa('Plack::Request')) { 'PlackRequest'; } else { if ($q->can('upload')){ # duck typing # this feature is needed by HTML::Shakan or other form validation libraries return $q->upload($name); # special case :) } else { die "unknown request type: $q"; } } }; $pkg = 'FormValidator::Lite::Upload::' . $pkg; _load($pkg)->new($q, $name); } 1;