#!/usr/bin/perl -sw
##
## Razor2::Errorhandler -- Base class that provides error
##                         handling functionality.
##
## Copyright (c) 2001, Vipul Ved Prakash.  All rights reserved.
## This code is free software; you can redistribute it and/or modify
## it under the same terms as Perl itself.
##
## $Id: Errorhandler.pm,v 1.5 2005/08/03 21:43:09 rsoderberg Exp $

package Razor2::Errorhandler;
use strict;
use warnings;

sub new {
    bless {}, shift;
}

sub error {
    my ( $self, $errstr, $construction_error ) = @_;
    if ($construction_error) {
        my ($package) = caller();
        no strict 'refs';
        my $spot = *{"${package}::errstr"}{SCALAR};
        $$spot = "$errstr\n";
    }
    else {
        $$self{errstr} = "$errstr\n";
    }
    $self->log( $self->{logerrors}, "Error: $errstr\n" ) if $self->{logerrors};
    return;
}

sub errstr {
    my $self = shift;
    return $$self{errstr};
}

sub errprefix {
    my ( $self, $prefix ) = @_;
    $$self{errstr} = $prefix . ": " . $$self{errstr};
    return;
}

sub errstrrst {
    my $self = shift;
    $$self{errstr} = "";
}

1;

=head1 NAME

Razor::Errorhandler - Error handling mechanism for Razor.

=head1 SYNOPSIS

    package Foo;

    use Razor::Errorhandler;
    @ISA = qw(Razor::Errorhandler);

    sub alive { 
        ..
        ..
        return 
        $self->error ("Awake, awake! Ring the alarum bell. \
                       Murther and treason!", $dagger) 
            if $self->murdered($king);
    }


    package main; 

    use Foo;
    my $foo = new Foo;
    $foo->alive($king) or print $foo->errstr(); 
    # prints "Awake, awake! ... "

=head1 DESCRIPTION 

Razor::Errorhandler encapsulates the error handling mechanism used by the
modules in Razor bundle. Razor::Errorhandler doesn't have a constructor
and is meant to be inherited. The derived modules use its two methods,
error() and errstr(), to communicate error messages to the caller.

When a method of the derived module fails, it calls $self->error() and
returns  to the caller. The error message passed to error() is made
available to the caller through the errstr() accessor. error() also
accepts a list of sensitive data that it wipes out (undef'es) before
returning.

The caller should B<never> call errstr() to check for errors. errstr()
should be called only when a method indicates (usually through an undef
return value) that an error has occured. This is because errstr() is
never overwritten and will always contain a value after the occurance of
first error.

=head1 METHODS

=over 4

=item B<error($mesage, ($wipeme, $wipemetoo))>

The first argument to error() is $message which is placed in
$self->{errstr} and the remaining arguments are interpretted as variables
containing sensitive data that are wiped out from the memory. error()
always returns undef.

=item B<errstr()> 

errstr() is an accessor method for $self->{errstr}.

=back

=head1 AUTHOR

Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>

=head1 SEE ALSO 

Razor::Client(3)

=cut

