use Proc.new to automatically do parameter checking for us