package OpenILS;
use strict;
use Error;
use vars qw/$VERSION $AUTOLOAD/;
$VERSION = do { my @r=(q$Revision$=~/\d+/g); sprintf "%d."."%02d"x$#r,@r };

=head1 OpenILS

=cut

=head2 Overview

 Top level class for OpenILS perl modules.

=cut

# Exception base classes
#use Exception::Class
#	( OpenILSException => { fields => [ 'errno' ] });
#push @Exception::Class::ISA, 'Error';

=head3 AUTOLOAD()

 Traps methods calls for methods that have not been defined so they
 don't propogate up the class hierarchy.

=cut
sub AUTOLOAD {
	my $self = shift;
	my $type = ref($self) || $self;
	my $name = $AUTOLOAD;
	my $otype = ref $self;
	
	my ($package, $filename, $line) = caller;
	my ($package1, $filename1, $line1) = caller(1);
	my ($package2, $filename2, $line2) = caller(2);
	my ($package3, $filename3, $line3) = caller(3);
	my ($package4, $filename4, $line4) = caller(4);
	my ($package5, $filename5, $line5) = caller(5);
	$name =~ s/.*://;   # strip fully-qualified portion
	warn <<"	WARN";
****
** ${name}() isn't there.  Please create me somewhere (like in $type)!
** Error at $package ($filename), line $line
** Call Stack (5 deep):
** 	$package1 ($filename1), line $line1
** 	$package2 ($filename2), line $line2
** 	$package3 ($filename3), line $line3
** 	$package4 ($filename4), line $line4
** 	$package5 ($filename5), line $line5
** Object type was $otype
****
	WARN
}



=head3 alert_abstract()

 This method is called by abstract methods to ensure that
 the process dies when an undefined abstract method is called

=cut
sub alert_abstract() {
	my $c = shift;
	my $class = ref( $c ) || $c;
	my ($file, $line, $method) = (caller(1))[1..3];
	die " * Call to abstract method $method at $file, line $line";
}

sub class {
	return scalar(caller);
}

1;
