As arturo is suggesting, it might be more prudent to
check parameters using defined rather than simple boolean
math. It is more practical, as well, since you can really
go to town:
sub lookup
{
my $self = shift;
my ($data_type,$item) = @_;
warn "data_type not provided\n" unless (defined $data_type);
warn "item not provided\n" unless (defined $item);
# ...
}