annotate variant_effect_predictor/Bio/Root/Root.pm @ 1:d6778b5d8382 draft default tip

Deleted selected files
author willmclaren
date Fri, 03 Aug 2012 10:05:43 -0400
parents 21066c0abaf5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1 package Bio::Root::Root;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4 # $Id: Root.pm,v 1.30 2002/12/16 09:44:28 birney Exp $
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8 Bio::Root::Root - Hash-based implementation of Bio::Root::RootI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12 # any bioperl or bioperl compliant object is a RootI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 # compliant object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15 # Here's how to throw and catch an exception using the eval-based syntax.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 $obj->throw("This is an exception");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 eval {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20 $obj->throw("This is catching an exception");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 if( $@ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24 print "Caught exception";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 print "no exception";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 # Alternatively, using the new typed exception syntax in the throw() call:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 $obj->throw( -class => 'Bio::Root::BadParameter',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 -text => "Can't open file $file",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 -value => $file);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 # Exceptions can be used in an eval{} block as shown above or within
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 # a try{} block if you have installed the Error.pm module.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 # Here's a brief example. For more, see Bio::Root::Exception
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 use Error qw(:try);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 try {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42 $obj->throw( # arguments as above );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44 catch Bio::Root::FileOpenException with {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 my $err = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 print "Handling exception $err\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47 };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51 This is a hashref-based implementation of the Bio::Root::RootI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 interface. Most bioperl objects should inherit from this.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 See the documentation for Bio::Root::RootI for most of the methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55 implemented by this module. Only overridden methods are described
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 here.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 =head2 Throwing Exceptions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 One of the functionalities that Bio::Root::RootI provides is the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 ability to throw() exceptions with pretty stack traces. Bio::Root::Root
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 enhances this with the ability to use B<Error.pm> (available from CPAN)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 if it has also been installed.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 If Error.pm has been installed, throw() will use it. This causes an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 Error.pm-derived object to be thrown. This can be caught within a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67 C<catch{}> block, from wich you can extract useful bits of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68 information. If Error.pm is not installed, it will use the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 Bio::Root::RootI-based exception throwing facilty.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 =head2 Typed Exception Syntax
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 The typed exception syntax of throw() has the advantage of plainly
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 indicating the nature of the trouble, since the name of the class
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 is included in the title of the exception output.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 To take advantage of this capability, you must specify arguments
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 as named parameters in the throw() call. Here are the parameters:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80 =over 4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82 =item -class
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 name of the class of the exception.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 This should be one of the classes defined in B<Bio::Root::Exception>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 or a custom error of yours that extends one of the exceptions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 defined in B<Bio::Root::Exception>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 =item -text
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 a sensible message for the exception
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 =item -value
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 the value causing the exception or $!, if appropriate.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 =back
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 Note that Bio::Root::Exception does not need to be imported into
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 your module (or script) namespace in order to throw exceptions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 via Bio::Root::Root::throw(), since Bio::Root::Root imports it.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 =head2 Try-Catch-Finally Support
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 In addition to using an eval{} block to handle exceptions, you can
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 also use a try-catch-finally block structure if B<Error.pm> has been
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 installed in your system (available from CPAN). See the documentation
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 for Error for more details.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 Here's an example. See the B<Bio::Root::Exception> module for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 other pre-defined exception types:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 try {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114 open( IN, $file) || $obj->throw( -class => 'Bio::Root::FileOpenException',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 -text => "Cannot open file $file for reading",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 -value => $!);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 catch Bio::Root::BadParameter with {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 my $err = shift; # get the Error object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 # Perform specific exception handling code for the FileOpenException
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 catch Bio::Root::Exception with {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 my $err = shift; # get the Error object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 # Perform general exception handling code for any Bioperl exception.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 otherwise {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 # A catch-all for any other type of exception
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129 finally {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 # Any code that you want to execute regardless of whether or not
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131 # an exception occurred.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 # the ending semicolon is essential!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 =head1 CONTACT
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138 Functions originally from Steve Chervitz. Refactored by Ewan Birney.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 Re-refactored by Lincoln Stein.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 =head1 APPENDIX
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 The rest of the documentation details each of the object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 methods. Internal methods are usually preceded with a _
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148 #'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 use vars qw(@ISA $DEBUG $ID $Revision $VERSION $VERBOSITY $ERRORLOADED);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 use Bio::Root::RootI;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153 use Bio::Root::IO;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 @ISA = 'Bio::Root::RootI';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 BEGIN {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 $ID = 'Bio::Root::Root';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 $VERSION = 1.0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161 $Revision = '$Id: Root.pm,v 1.30 2002/12/16 09:44:28 birney Exp $ ';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 $DEBUG = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163 $VERBOSITY = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 $ERRORLOADED = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 # Check whether or not Error.pm is available.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 # $main::DONT_USE_ERROR is intended for testing purposes and also
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 # when you don't want to use the Error module, even if it is installed.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 # Just put a INIT { $DONT_USE_ERROR = 1; } at the top of your script.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 if( not $main::DONT_USE_ERROR ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 if ( eval "require Error" ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 import Error qw(:try);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 require Bio::Root::Exception;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 $ERRORLOADED = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 $Error::Debug = 1; # enable verbose stack trace
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 if( !$ERRORLOADED ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 require Carp; import Carp qw( confess );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 $main::DONT_USE_ERROR; # so that perl -w won't warn "used only once"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 =head2 new
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 Purpose : generic instantiation function can be overridden if
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191 special needs of a module cannot be done in _initialize
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 # my ($class, %param) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 my $class = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 my $self = {};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 bless $self, ref($class) || $class;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201 if(@_ > 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 # if the number of arguments is odd but at least 3, we'll give
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 # it a try to find -verbose
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 shift if @_ % 2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 my %param = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206 ## See "Comments" above regarding use of _rearrange().
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 $self->verbose($param{'-VERBOSE'} || $param{'-verbose'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 return $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213 =head2 verbose
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 Title : verbose
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 Usage : $self->verbose(1)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 Function: Sets verbose level for how ->warn behaves
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 -1 = no warning
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 0 = standard, small warning
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220 1 = warning with stack trace
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 2 = warning becomes throw
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 Returns : The current verbosity setting (integer between -1 to 2)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 Args : -1,0,1 or 2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 sub verbose {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 # allow one to set global verbosity flag
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 return $DEBUG if $DEBUG;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 return $VERBOSITY unless ref $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234 if (defined $value || ! defined $self->{'_root_verbose'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 $self->{'_root_verbose'} = $value || 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 return $self->{'_root_verbose'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 sub _register_for_cleanup {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241 my ($self,$method) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 if($method) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 if(! exists($self->{'_root_cleanup_methods'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244 $self->{'_root_cleanup_methods'} = [];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 push(@{$self->{'_root_cleanup_methods'}},$method);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 sub _unregister_for_cleanup {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 my ($self,$method) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 my @methods = grep {$_ ne $method} $self->_cleanup_methods;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 $self->{'_root_cleanup_methods'} = \@methods;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257 sub _cleanup_methods {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259 return unless ref $self && $self->isa('HASH');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 my $methods = $self->{'_root_cleanup_methods'} or return;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 @$methods;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265 =head2 throw
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 Title : throw
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268 Usage : $obj->throw("throwing exception message");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 $obj->throw( -class => 'Bio::Root::Exception',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 -text => "throwing exception message",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 -value => $bad_value );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273 Function: Throws an exception, which, if not caught with an eval or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274 a try block will provide a nice stack trace to STDERR
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275 with the message.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 If Error.pm is installed, and if a -class parameter is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277 provided, Error::throw will be used, throwing an error
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278 of the type specified by -class.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 If Error.pm is installed and no -class parameter is provided
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 (i.e., a simple string is given), A Bio::Root::Exception
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281 is thrown.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 Returns : n/a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283 Args : A string giving a descriptive error message, optional
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284 Named parameters:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 '-class' a string for the name of a class that derives
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286 from Error.pm, such as any of the exceptions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287 defined in Bio::Root::Exception.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288 Default class: Bio::Root::Exception
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 '-text' a string giving a descriptive error message
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 '-value' the value causing the exception, or $! (optional)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292 Thus, if only a string argument is given, and Error.pm is available,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 this is equivalent to the arguments:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 -text => "message",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295 -class => Bio::Root::Exception
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 Comments : If Error.pm is installed, and you don't want to use it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297 for some reason, you can block the use of Error.pm by
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 Bio::Root::Root::throw() by defining a scalar named
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 $main::DONT_USE_ERROR (define it in your main script
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300 and you don't need the main:: part) and setting it to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 a true value; you must do this within a BEGIN subroutine.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 #'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 sub throw{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 my ($self,@args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 my ( $text, $class ) = $self->_rearrange( [qw(TEXT CLASS)], @args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312 if( $ERRORLOADED ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313 # print STDERR " Calling Error::throw\n\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315 # Enable re-throwing of Error objects.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316 # If the error is not derived from Bio::Root::Exception,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 # we can't guarantee that the Error's value was set properly
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318 # and, ipso facto, that it will be catchable from an eval{}.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 # But chances are, if you're re-throwing non-Bio::Root::Exceptions,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 # you're probably using Error::try(), not eval{}.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 # TODO: Fix the MSG: line of the re-thrown error. Has an extra line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 # containing the '----- EXCEPTION -----' banner.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 if( ref($args[0])) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324 if( $args[0]->isa('Error')) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 my $class = ref $args[0];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326 throw $class ( @args );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 my $text .= "\nWARNING: Attempt to throw a non-Error.pm object: " . ref$args[0];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 my $class = "Bio::Root::Exception";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 throw $class ( '-text' => $text, '-value' => $args[0] );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 $class ||= "Bio::Root::Exception";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 my %args;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 if( @args % 2 == 0 && $args[0] =~ /^-/ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337 %args = @args;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338 $args{-text} = $text;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 $args{-object} = $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342 throw $class ( scalar keys %args > 0 ? %args : @args ); # (%args || @args) puts %args in scalar context!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346 # print STDERR " Not calling Error::throw\n\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 $class ||= '';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 my $std = $self->stack_trace_dump();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349 my $title = "------------- EXCEPTION $class -------------";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350 my $footer = "\n" . '-' x CORE::length($title);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351 $text ||= '';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353 my $out = "\n$title\n" .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354 "MSG: $text\n". $std . $footer . "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356 die $out;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360 =head2 debug
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362 Title : debug
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363 Usage : $obj->debug("This is debugging output");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 Function: Prints a debugging message when verbose is > 0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365 Returns : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366 Args : message string(s) to print to STDERR
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 sub debug{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371 my ($self,@msgs) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373 if( $self->verbose > 0 ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374 print STDERR join("", @msgs);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378 =head2 _load_module
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380 Title : _load_module
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 Usage : $self->_load_module("Bio::SeqIO::genbank");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 Function: Loads up (like use) the specified module at run time on demand.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 Returns : TRUE on success. Throws an exception upon failure.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 .
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386 Args : The module to load (_without_ the trailing .pm).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 sub _load_module {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 my ($self, $name) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392 my ($module, $load, $m);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393 $module = "_<$name.pm";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 return 1 if $main::{$module};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 # untaint operation for safe web-based running (modified after a fix
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 # a fix by Lincoln) HL
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 if ($name !~ /^([\w:]+)$/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 $self->throw("$name is an illegal perl package name");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402 $load = "$name.pm";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403 my $io = Bio::Root::IO->new();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404 # catfile comes from IO
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 $load = $io->catfile((split(/::/,$load)));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406 eval {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 require $load;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409 if ( $@ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 $self->throw("Failed to load module $name. ".$@);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412 return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416 sub DESTROY {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 my @cleanup_methods = $self->_cleanup_methods or return;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419 for my $method (@cleanup_methods) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 $method->($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427