WWW::USF::Directory::Exception - Basic exception object for WWW::USF::Directory


WWW-USF-Directory documentation Contained in the WWW-USF-Directory distribution.

Index


Code Index:

NAME

Top

WWW::USF::Directory::Exception - Basic exception object for WWW::USF::Directory

VERSION

Top

Version 0.003

SYNOPSIS

Top

  use WWW::USF::Directory::Exception;

  # Throw a generic error message
  WWW::USF::Directory::Exception->throw(
    message => 'This is some error message',
  );

DESCRIPTION

Top

This is a basic exception class for the WWW::USF::Directory library.

ATTRIBUTES

Top

message

Required. This is a string that contains the error message for the exception.

METHODS

Top

stringify

This method is used to return a string that will be given when this object is used in a string context. Classes inheriting from this class are welcome to override this method. By default (as in, in this class) this method simply returns the contents of the message attribute.

  my $error = WWW::USF::Directory::Exception->new(message => 'Error message');

  print $error; # Prints "Error message"

throw

This method will take a HASH as the argument and will pass this HASH to the constructor of the class, and then throw the newly constructed object. An extra option that will be stripped is class. This option will actually construct a different class, where this class is in the package space below the specified class.

  eval {
    WWW::USF::Directory->throw(
      class   => 'ClassName',
      message => 'An error occurred',
    );
  };

  print ref $@; # Prints WWW::USF::Directory::Exception::ClassName

DEPENDENCIES

Top

* Carp
* English
* Moose 0.89
* MooseX::StrictConstructor 0.08
* namespace::clean 0.04

AUTHOR

Top

Douglas Christopher Wilson, <doug at somethingdoug.com>

BUGS AND LIMITATIONS

Top

Please report any bugs or feature requests to bug-www-usf-directory at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=WWW::USF::Directory. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

I highly encourage the submission of bugs and enhancements to my modules.

LICENSE AND COPYRIGHT

Top


WWW-USF-Directory documentation Contained in the WWW-USF-Directory distribution.

package WWW::USF::Directory::Exception;

use 5.008001;
use strict;
use warnings 'all';

###########################################################################
# METADATA
our $AUTHORITY = 'cpan:DOUGDUDE';
our $VERSION   = '0.003';

###########################################################################
# MOOSE
use Moose 0.89;
use MooseX::StrictConstructor 0.08;

###########################################################################
# MOOSE TYPES
use MooseX::Types::Moose qw(
	Str
);

###########################################################################
# MODULE IMPORTS
use Carp qw(croak);
use English qw(-no_match_vars);

###########################################################################
# ALL IMPORTS BEFORE THIS WILL BE ERASED
use namespace::clean 0.04 -except => [qw(meta)];

###########################################################################
# OVERLOADED FUNCTIONS
__PACKAGE__->meta->add_package_symbol(q{&()}  => sub {                  });
__PACKAGE__->meta->add_package_symbol(q{&(""} => sub { shift->stringify });

###########################################################################
# ATTRIBUTES
has message => (
	is  => 'ro',
	isa => Str,

	documentation => q{The error message},
	required      => 1,
);

###########################################################################
# METHODS
sub stringify {
	my ($self) = @_;

	# The default stringify method just returns the contents of the message
	# attribute.
	return $self->message;
}
sub throw {
	my ($class, %args) = @_;

	if (blessed $class) {
		# Since $class is blessed, this was probably called as a method, so
		# make $class the class name.
		$class = blessed $class;
	}

	# Get the class to make the exception in
	my $exception_class = delete $args{class};

	if (!defined $exception_class) {
		# The class was not specified, so just make it in our class
		croak $class->new(%args);
	}

	# Prefix this class to the beginning of the exception class
	$exception_class = sprintf '%s::%s', $class, $exception_class;

	if ($exception_class !~ m{\A \w+ (?: :: \w+)* \z}imsx) {
		# The class name doesn't seem good, so toss it because we don't want
		# to be evaulating bad code.
		croak $class->new(
			message => 'The provided class name seemed like a bad name',
		);
	}

	# Attempt to load the exception class
	## no critic qw(BuiltinFunctions::ProhibitStringyEval)
	if (!eval "use $exception_class; 1") {
		croak $class->new(
			message => sprintf 'Unable to initiate the %s error class: %s',
				$exception_class, $EVAL_ERROR
		);
	}

	croak $exception_class->new(%args);
}

###########################################################################
# MAKE MOOSE OBJECT IMMUTABLE
__PACKAGE__->meta->make_immutable;

1;

__END__