Error.pm.diff   [plain text]


--- Error-0.15/Error.pm	Tue Feb 10 18:37:07 2004
+++ /tmp/Error.pm	Thu Apr 15 12:13:04 2004
@@ -250,6 +250,36 @@
     $text;
 }
 
+sub id () {
+    my $self = shift;
+
+    my $id = $self->{id};
+
+    if ( defined( $id )) {
+        return( $id );
+    }
+
+    $self->{id} = Message->id( from => $self->{-text} );
+    return(  $self->{ id } );
+}
+
+sub idMatches {
+    my $self = shift;
+
+    my %args;
+    my %targs = @_;
+    foreach my $arg ( keys %targs ) {
+        $args{ lc( $arg ) } = lc( $targs{ $arg } );
+    }
+    my $argID = $args{ id };
+
+    my $id = lc($self->id());
+
+    my $match = ( $id eq $argID );
+
+    return $match;
+}
+
 ##########################################################################
 ##########################################################################
 
@@ -258,10 +288,11 @@
 
 package Error::subs;
 
+use Data::Dumper;
 use Exporter ();
 use vars qw(@EXPORT_OK @ISA %EXPORT_TAGS);
 
-@EXPORT_OK   = qw(try with finally except otherwise);
+@EXPORT_OK   = qw(try with finally except otherwise catch annotate );
 %EXPORT_TAGS = (try => \@EXPORT_OK);
 
 @ISA = qw(Exporter);
@@ -269,9 +300,19 @@
 sub run_clauses ($$$\@) {
     my($clauses,$err,$wantarray,$result) = @_;
     my $code = undef;
+	my $annotate = $clauses->{'annotate'};
 
     $err = new Error::Simple($err) unless ref($err);
 
+    #-----------------------------------------
+    # Prepend the annotation if there is one.
+    # Keep the message id in front.
+    #-----------------------------------------
+    if(defined($annotate)) {
+        my $annotation = eval{ $annotate->() };
+        $err->{'-stacktrace'} = $annotation . $err if !$@ && $annotation ne '';
+    }
+
     CATCH: {
 
 	# catch
@@ -282,6 +323,7 @@
 	    CATCHLOOP:
 	    for( ; $i < @$catch ; $i += 2) {
 		my $pkg = $catch->[$i];
+
 		unless(defined $pkg) {
 		    #except
 		    splice(@$catch,$i,2,$catch->[$i+1]->());
@@ -324,7 +366,11 @@
 
 	# otherwise
 	my $owise;
-	if(defined($owise = $clauses->{'otherwise'})) {
+	  if ( (! $err->isa('Termination') ) &&
+		   ( defined( $owise = $clauses->{'otherwise'} )))
+	  {
+
+#	  if(defined($owise = $clauses->{'otherwise'})) {
 	    my $code = $clauses->{'otherwise'};
 	    my $more = 0;
 	    my $ok = eval {
@@ -463,6 +509,29 @@
     $clauses;
 }
 
+sub catch (&;$) {
+	if ( ref( $_[0] ) eq "CODE" ) {
+		goto &otherwise;
+	}
+	else {
+		Error::catch( @_ );
+	}
+}
+
+sub annotate (&;$) {
+    my $code = shift;
+    my $clauses = shift || {};
+
+    if(exists $clauses->{'annotate'}) {
+        require Carp;
+		Carp::croak("Multiple annotate clauses");
+    }
+
+    $clauses->{'annotate'} = $code;
+
+    $clauses;
+}
+
 1;
 __END__