package RWDE::Exceptions;

use vars qw($VERSION);
$VERSION = sprintf "%d", q$Revision: 515 $ =~ /(\d+)/;

=pod

=head1 RWDE::Exceptions

Exception container file, contains definitions for RWDE Exceptions

System defined exceptions are based off of the default behaviour of this base exception class

=cut

=head1 Exception class definitions for RWDE

=cut

=head2 RWDE::BaseException()
    
=cut
package RWDE::BaseException;

use strict;
use warnings;

use RWDE::DB::DbRegistry;

use base qw(Error);

use overload ('""' => 'stringify');

=head2 new()

Override for the "new" method in the Error base class, initializes the instance the way we want.

This will return an initialized instance of Error

=cut

sub new {
  my ($proto, $params) = @_;

  my $class = ref($proto) || $proto;

  my $info  = defined $$params{info} ? $$params{info} : 'none';
  my $value = defined $$params{value} ? $$params{info} : 'none';

  if (defined $$params{abort_transaction}) {
    RWDE::DB::DbRegistry->abort_transaction();
  }

  local $Error::Depth = $Error::Depth + 1;
  local $Error::Debug = 1;                   # Enables storing of stacktrace

  my $exception = $class->SUPER::new(-text => $info, -value => $value);

  return $exception;
}

=head2 is_retry()

Determine whether this was a retry attempt

=cut

sub is_retry {
  my ($self) = @_;

  return $self->{'-value'} =~ m/retry/ig;
}

1;

=head1 Exception class definitions for RWDE

=cut

=head2 RWDE::DevelException()

Caught with RWDE::DevelException - developer only exceptions, typically for unplanned behaviour

=cut

package RWDE::DevelException;
use base qw(RWDE::BaseException);

1;

=head2 RWDE::DataMissingException()

caught with RWDE::DataMissingException - missing data detected

=cut

package RWDE::DataMissingException;
use base qw(RWDE::BaseException);
1;

=head2 RWDE::DataBadException()

Caught with RWDE::DataBadException - Invalid data detected

=cut

package RWDE::DataBadException;
use base qw(RWDE::BaseException);
1;

=head2 RWDE::DataLimitException()

Caught with RWDE::DataLimitException -  Limit or threshold exceeded

=cut

package RWDE::DataLimitException;
use base qw(RWDE::BaseException);
1;

=head2 RWDE::DataDuplicateException()

Caught with RWDE::DataDuplicateException - Discovered duplicate data (typically db related)

=cut

package RWDE::DataDuplicateException;
use base qw(RWDE::BaseException);
1;

=head2 RWDE::DataNotFoundException()

Caught with RWDE::DataNotFoundException - Expected data does not exist

=cut

package RWDE::DataNotFoundException;
use base qw(RWDE::BaseException);
1;

=head2 RWDE::BadPasswordException()

Caught with RWDE::BadPasswordException - Problems accepting a password

=cut

package RWDE::BadPasswordException;
use base qw(RWDE::BaseException);
1;

=head2 RWDE::SSLException()

Caught with RWDE::SSLException - Problems with http SSL connections

=cut

package RWDE::SSLException;
use base qw(RWDE::BaseException);
1;

=head2 RWDE::Web::SessionMissingException()

Caught with RWDE::Web::SessionMissingException - Problem with the session occurred

=cut

package RWDE::Web::SessionMissingException;
use base qw(RWDE::BaseException);
1;

=head2 RWDE::StatusException()

Caught with RWDE::StatusException - Problem with instance status

=cut

package RWDE::StatusException;
use base qw(RWDE::BaseException);
1;

=head2 RWDE::DatabaseErrorException()

Caught with RWDE::DatabaseErrorException - Internal db problem detected

=cut

package RWDE::DatabaseErrorException;
use base qw(RWDE::BaseException);
1;

=head2 RWDE::PolicyException()

Caught with RWDE::PolicyException - Policy violation occurred

=cut

package RWDE::PolicyException;
use base qw(RWDE::BaseException);
1;

=head2 RWDE::PermissionException()

Caught with RWDE::PermissionException - Permission violation occurred

=cut

package RWDE::PermissionException;
use base qw(RWDE::BaseException);
1;

=head2 RWDE::DefaultException()

Caught with RWDE::DefaultException - Default Exception - undefined exceptions are funnelled here

=cut

package RWDE::DefaultException;
use base qw(RWDE::BaseException);
1;