sub new { my ($class, %args) = @_; return 'Error in syntax usage' unless _arg_validation(\%args); my $self = { ua => _mk_ua(), login => $args{login}, password => $args{password}, dir => $args{dir}, threads => 30, }; bless $self, $class; die 'ERROR WITH CONNECTION AUTH' unless $self->_connection_try(); return $self; } #### my $a; eval { my $vk = mp3vk_api->new ( login => 'mail@mail.com', password => 'passwd', dir => 'Rhapsody', threads => '10', ); if (ref($vk) eq 'mp3vk_api') { my $out = $vk->search('Rhapsody'); if (ref $out) { my $a = $vk->vk_download($out); } else { # handle possible search failure # throw an exception } } else { # handle constructor failure # throw an exception } }; if ($@) { # catch all exceptions and handle those which haven't been handled already } else { # use $a normally } #### sub _arg_validation { my $args = shift; my $dir = "$ENV{HOME}/vk_music/"; $dir .= "$args->{dir}/" if defined $args->{dir}; mkdir $dir; $args->{dir} = $dir; return 1 if defined $args->{login} && defined $args->{password} && $args->{login} =~ /^.*?\@.*?$/ && $args->{password} =~ /\w{2,}/; return 0; }