0
|
1 #-----------------------------------------------------------------------------
|
|
2 # PACKAGE : Bio::Root::Object.pm
|
|
3 # AUTHOR : Steve Chervitz (sac@bioperl.org)
|
|
4 # CREATED : 23 July 1996
|
|
5 # REVISION: $Id: Object.pm,v 1.23 2002/10/22 07:38:37 lapp Exp $
|
|
6 # STATUS : Alpha
|
|
7 #
|
|
8 # For documentation, run this module through pod2html
|
|
9 # (preferably from Perl v5.004 or better).
|
|
10 #
|
|
11 # MODIFICATION NOTES: See bottom of file.
|
|
12 #
|
|
13 # Copyright (c) 1996-2000 Steve Chervitz. All Rights Reserved.
|
|
14 # This module is free software; you can redistribute it and/or
|
|
15 # modify it under the same terms as Perl itself.
|
|
16 # Retain this notice and note any modifications made.
|
|
17 #-----------------------------------------------------------------------------
|
|
18
|
|
19 package Bio::Root::Object;
|
|
20 use strict;
|
|
21
|
|
22 require 5.002;
|
|
23 use Bio::Root::Global qw(:devel $AUTHORITY $CGI);
|
|
24 use Bio::Root::Root;
|
|
25
|
|
26 use Exporter ();
|
|
27
|
|
28 #use AutoLoader;
|
|
29 #*AUTOLOAD = \&AutoLoader::AUTOLOAD;
|
|
30
|
|
31 use vars qw(@EXPORT_OK %EXPORT_TAGS);
|
|
32 @EXPORT_OK = qw($VERSION &find_object &stack_trace &containment &_rearrange);
|
|
33 %EXPORT_TAGS = ( std => [qw(&stack_trace &containment)] );
|
|
34
|
|
35 use vars qw($ID $VERSION %Objects_created $Revision @ISA);
|
|
36
|
|
37 @ISA = qw(Bio::Root::Root);
|
|
38
|
|
39
|
|
40 # %Objects_created can be used for tracking all objects created.
|
|
41 # See _initialize() for details.
|
|
42
|
|
43 $ID = 'Bio::Root::Object';
|
|
44 $VERSION = 0.041;
|
|
45 $Revision = '$Id: Object.pm,v 1.23 2002/10/22 07:38:37 lapp Exp $'; #'
|
|
46
|
|
47 ### POD Documentation:
|
|
48
|
|
49 =head1 NAME
|
|
50
|
|
51 Bio::Root::Object - A core Perl 5 object.
|
|
52
|
|
53 =head1 SYNOPSIS
|
|
54
|
|
55 Use this module as the root of your inheritance tree.
|
|
56
|
|
57 =head2 Object Creation
|
|
58
|
|
59 require Bio::Root::Object;
|
|
60
|
|
61 $dad = new Bio::Root::Object();
|
|
62 $son = new Bio::Root::Object(-name => 'Junior',
|
|
63 -parent => $dad,
|
|
64 -make => 'full');
|
|
65
|
|
66
|
|
67 See the L<new()|new> method for a complete description of parameters.
|
|
68 See also L<the USAGE section | USAGE>.
|
|
69
|
|
70 =head1 DESCRIPTION
|
|
71
|
|
72 B<Bio::Root::Object> attempts to encapsulate the "core" Perl5
|
|
73 object: What are the key data and behaviors ALL (or at least most) Perl5
|
|
74 objects should have?
|
|
75
|
|
76 =head2 Rationale
|
|
77
|
|
78 Use of B<Bio::Root::Object.pm> within the Bioperl framework facilitates
|
|
79 operational consistency across the different modules defined within
|
|
80 the B<Bio::> namespace. Not all objects need to derive from
|
|
81 B<Bio::Root::Object.pm>. However, when generating lots of different types
|
|
82 of potentially complex objects which should all conform to a set of
|
|
83 basic expectations, this module may be handy.
|
|
84
|
|
85 At the very least, this module saves you from re-writing the L<new()|new>
|
|
86 method for each module you develop. It also permits consistent and
|
|
87 robust handling of C<-tag =E<gt> value> method arguments via the
|
|
88 L<Bio::Root::RootI::_rearrange()|Bio::Root::RootI> method and provides a
|
|
89 object-oriented way handle exceptions and warnings via the L<Bio::Root::Root::throw()|Bio::Root::Root> and L<Bio::Root::Root::warn()|Bio::Root::Root> methods.
|
|
90
|
|
91 See L<the APPENDIX section | APPENDIX> for some other handy methods.
|
|
92
|
|
93 =head2 Fault-Tolerant Objects
|
|
94
|
|
95 A major motivation for this module was to promote the creation of robust,
|
|
96 fault-tolerant Perl5 objects. The L<Bio::Root::Root::throw()|Bio::Root::Root> method relies on Perl's built-in
|
|
97 C<eval{}/die> exception mechanism to generate fatal exceptions.
|
|
98 The data comprising an exception is managed by the B<Bio::Root::Err.pm>
|
|
99 module, which essentially allows the data thrown by a C<die()> event to be
|
|
100 wrapped into an object that can be easily examined and possibly re-thrown.
|
|
101
|
|
102 The intent here is three-fold:
|
|
103
|
|
104 =over 4
|
|
105
|
|
106 =item 1 Detailed error reporting.
|
|
107
|
|
108 Allow objects to report detailed information about the error condition
|
|
109 (who, what, where, why, how).
|
|
110
|
|
111 =item 2 Handle complex errors in objects.
|
|
112
|
|
113 The goal is to make it relatively painless to detect and handle the wide
|
|
114 variety of errors possible with a complex Perl object.
|
|
115 Perl's error handling mechanism is a might clunky when it comes to
|
|
116 handling complex errors within complex objects, but it is improving.
|
|
117
|
|
118 =item 3 Efficient & easy exception handling.
|
|
119
|
|
120 To enable robust exception handling without incurring a significant
|
|
121 performance penalty in the resulting code. Ideally, exception handling
|
|
122 code should be transparent to the cpu until and unless an exception
|
|
123 arises.
|
|
124
|
|
125 =back
|
|
126
|
|
127 These goals may at times be at odds and we are not claiming
|
|
128 to have achieved the perfect balance. Ultimately, we want self-
|
|
129 sufficient object-oriented systems able to deal with their own errors.
|
|
130 This area should improve as the module, and Perl, evolve.
|
|
131 One possible modification might be to utilize Graham Barr's B<Error.pm>
|
|
132 module or Torsten Ekedahl's B<Experimental::Exception.pm> module
|
|
133 (see L<Other Exception Modules>).
|
|
134 Technologies such as these may eventually be
|
|
135 incorporated into future releases of Perl. The exception handling
|
|
136 used by B<Bio::Root::Object.pm> can be expected to change as Perl's
|
|
137 exception handling mechanism evolves.
|
|
138
|
|
139 B<TERMINOLOGY NOTE:> In this discussion and elsewhere in this module,
|
|
140 the terms "Exception" and "Error" are used interchangeably to mean
|
|
141 "something unexpected occurred" either as a result of incorrect user
|
|
142 input or faulty internal processing.
|
|
143
|
|
144 =head1 USAGE
|
|
145
|
|
146 =head2 Basic Exception handling
|
|
147
|
|
148 Object construction is a common place for exceptions to occur. By wrapping
|
|
149 the construction in an C<eval{ }> block, we can prevent the exception from
|
|
150 crashing the script and attempt to recover gracefully:
|
|
151
|
|
152 # Package Foo.pm IS-A Bio::Root::Object.pm
|
|
153
|
|
154 $obj = eval { new Foo(@data) }; # ending semicolon required.
|
|
155 if($@) {
|
|
156 print STDERR "\nTrouble creating Foo object: $@\n";
|
|
157 recover_gracefully($@);
|
|
158 }
|
|
159
|
|
160 A common strategy when generating lots of objects is to collect
|
|
161 data about which objects failed to build but still permit
|
|
162 the successfully created ones get processed:
|
|
163
|
|
164 @errs = ();
|
|
165 foreach $thing ( @stuff ) {
|
|
166 my $obj = eval { new Foo($thing) };
|
|
167 if($@) {
|
|
168 push @err, [$thing, $@];
|
|
169 }
|
|
170 else {
|
|
171 process_obj($obj);
|
|
172 }
|
|
173 }
|
|
174
|
|
175 Post-mortem reporting, logging, or analysis of the problems ensues:
|
|
176
|
|
177 if(@errs) {
|
|
178 printf "\n%d things failed:\n", scalar(@errs);
|
|
179 foreach(@errs) { print "$err->[0], ";}
|
|
180
|
|
181 print "\n\nTrapped exceptions:\n";
|
|
182 foreach(@errs) { print "$err->[1]\n";}
|
|
183 }
|
|
184
|
|
185 New with B<Perl 5.005> is the ability to C<die()> with an object
|
|
186 reference in C<$@> instead of just a string. This feature is not yet
|
|
187 exploited in Bio::Root::Object.pm but may be in future versions.
|
|
188 Bio::Root::Err.pm objects can be reconstructed from the contents of C<$@>:
|
|
189
|
|
190 eval{ # exception-prone code here... };
|
|
191 if($@) {
|
|
192 $err = new Bio::Root::Err($@);
|
|
193 printf "Trouble: %s\n". $err->msg;
|
|
194 printf "Stack trace: %s\n". $err->stack;
|
|
195 }
|
|
196
|
|
197
|
|
198 =head2 Demo Scripts
|
|
199
|
|
200 Some demo script that illustrate working with Bio::Root::Objects
|
|
201 are included with the distribution in the examples/root_object directory.
|
|
202
|
|
203
|
|
204 =head1 STRICTNESS & VERBOSITY
|
|
205
|
|
206 There are two global variables that can be used to control sensitivity to
|
|
207 exceptions/warnings and the amount of reporting for all objects within a process.
|
|
208 These are accessed via functions B<strictness()> and B<verbosity()> exported by
|
|
209 Bio::Root::Global (see L<Bio::Root::Global>).
|
|
210
|
|
211 $STRICTNESS - Regulates the sensitivity of the object to exceptions and warnings.
|
|
212
|
|
213 $VERBOSITY - Regulates the amount of reporting by an object.
|
|
214
|
|
215
|
|
216 The L<strict()|strict> and L<verbose()|verbose> methods of B<Bio::Root::Object>
|
|
217 originally operated at the the object level, to permit individual
|
|
218 strictness and verbosity levels for different objects. This level of
|
|
219 control is not usually required and can often be inconvenient; one
|
|
220 typically wants to set these properties globally for a given
|
|
221 script. While this sacrifices some flexibility, it saves time and
|
|
222 memory when working with lots of objects. For instance, child objects
|
|
223 don't have to worry about checking their parents to determine their
|
|
224 strictness/verbosity levels. Strictness and verbosity are
|
|
225 globally-defined values, but different classes of objects can be
|
|
226 differentially sensitive to these values depending on design criteria.
|
|
227
|
|
228 Strictness and verbosity can be positive or negative. Negative
|
|
229 verbosity equals terseness; negative strictness equals permissiveness.
|
|
230 In B<Bio::Root::Object> only the Bio::Root::Root::throw() and
|
|
231 Bio::Root::Root::warn() methods (see L<Bio::Root::Root>) are sensitive to
|
|
232 these values as indicated in the tables below:
|
|
233
|
|
234 +---------+
|
|
235 | throw() | v e r b o s i t y
|
|
236 +---------+ -------------------------------------
|
|
237 -1 0 1
|
|
238 s ---------- ----------- ----------
|
|
239 t
|
|
240 r -2 -- throw() converted into warn()
|
|
241 i
|
|
242 c -1 | Exception Exception Exception
|
|
243 t 0 |_ printed printed printed
|
|
244 n 1 | without with with stack
|
|
245 e 2 | stack trace stack trace trace and
|
|
246 s | sysbeep
|
|
247 s
|
|
248
|
|
249
|
|
250 +---------+
|
|
251 | warn() | v e r b o s i t y
|
|
252 +---------+ --------------------------------------
|
|
253 -1 0 1
|
|
254 s ---------- ----------- -----------
|
|
255 t
|
|
256 r -2 | Warning Warning Warning
|
|
257 i -1 |_ not printed printed
|
|
258 c 0 | printed without with stack
|
|
259 t 1 | but stack trace trace and
|
|
260 n | attached* sysbeep
|
|
261 e
|
|
262 s 2 -- warn() converted into throw()
|
|
263 s
|
|
264
|
|
265 (*) Warnings will be attached to an object if the
|
|
266 -record_err =>1 flag is set when constructing the object
|
|
267 or if $object->record_err(1) is called subsequent to creation.
|
|
268
|
|
269 See the methods L<verbose()|verbose>, L<strict()|strict>, L<record_err()|record_err>,
|
|
270 Bio::Root::Root::throw(), and Bio::Root::Root::warn() in
|
|
271 L<Bio::Root::Root> for more details.
|
|
272
|
|
273
|
|
274 =head1 DEPENDENCIES
|
|
275
|
|
276 As the B<Bio::Root::Object> does not inherit from any modules
|
|
277 but wraps (i.e., provides an interface and delegates
|
|
278 functionality to) other modules in the Bio::Root:: hierarchy:
|
|
279
|
|
280 Module Purpose
|
|
281 -------------------- ------------------------------------
|
|
282 Bio::Root::Err.pm Exception handling
|
|
283 Bio::Root::IOManager.pm Input/output of object data or error data
|
|
284 Bio::Root::Xref.pm Arbitrary links between objects
|
|
285
|
|
286 All of these modules are loaded only when necessary.
|
|
287 B<Bio::Root::Err> is an object representing an exception.
|
|
288 B<Bio::Root::IOManager> and B<Bio::Root::Xref> are more experimental. They are
|
|
289 utilized via delegation, which permits them to be developed and utilized
|
|
290 independently of B<Bio::Root::Object>.
|
|
291
|
|
292 Since this module is at the root of potentially many different objects
|
|
293 in a particular application, efficiency is important. Bio::Root::Object.pm is
|
|
294 intended to be a lightweight, lean and mean module.
|
|
295
|
|
296
|
|
297 =head1 FEEDBACK
|
|
298
|
|
299 =head2 Mailing Lists
|
|
300
|
|
301 User feedback is an integral part of the evolution of this and other Bioperl modules.
|
|
302 Send your comments and suggestions preferably to one of the Bioperl mailing lists.
|
|
303 Your participation is much appreciated.
|
|
304
|
|
305 bioperl-l@bioperl.org - General discussion
|
|
306 http://bioperl.org/MailList.shtml - About the mailing lists
|
|
307
|
|
308 =head2 Reporting Bugs
|
|
309
|
|
310 Report bugs to the Bioperl bug tracking system to help us keep track the bugs and
|
|
311 their resolution. Bug reports can be submitted via email or the web:
|
|
312
|
|
313 bioperl-bugs@bio.perl.org
|
|
314 http://bugzilla.bioperl.org/
|
|
315
|
|
316 =head1 AUTHOR
|
|
317
|
|
318 Steve Chervitz E<lt>sac@bioperl.orgE<gt>
|
|
319
|
|
320 See L<the FEEDBACK section | FEEDBACK> for where to send bug reports and comments.
|
|
321
|
|
322 =head1 VERSION
|
|
323
|
|
324 Bio::Root::Object.pm, 0.041
|
|
325
|
|
326
|
|
327 =head1 TODO
|
|
328
|
|
329 =over 0
|
|
330
|
|
331 =item * Experiment with other Exception classes.
|
|
332
|
|
333 Consider incorporating a more widely-used Error/Exception module
|
|
334 (see L<Other Exception Modules>).
|
|
335
|
|
336 =item * Think about integration with Data::Dumper.pm for persisting objects.
|
|
337
|
|
338 =back
|
|
339
|
|
340 =head1 SEE ALSO
|
|
341
|
|
342 L<Bio::Root::Err> - Error/Exception object
|
|
343 L<Bio::Root::IOManager> - Input/Output manager object
|
|
344 L<Bio::Root::Vector> - Manages dynamic lists of objects
|
|
345 L<Bio::Root::Xref> - Cross-reference object
|
|
346 L<Bio::Root::Global> - Manages global variables/constants
|
|
347
|
|
348 http://bio.perl.org/Projects/modules.html - Online module documentation
|
|
349 http://bio.perl.org/ - Bioperl Project Homepage
|
|
350
|
|
351 =head2 Other Exception Modules
|
|
352
|
|
353 Experimental::Exception.pm - ftp://ftp.matematik.su.se/pub/teke/
|
|
354 Error.pm - http://www.cpan.org/authors/id/GBARR/
|
|
355 Throwable.pm - mailto:kstevens@globeandmail.ca
|
|
356
|
|
357 http://genome-www.stanford.edu/perlOOP/exceptions.html
|
|
358
|
|
359 =head1 ACKNOWLEDGEMENTS
|
|
360
|
|
361 This module was developed under the auspices of the Saccharomyces Genome
|
|
362 Database:
|
|
363
|
|
364 http://genome-www.stanford.edu/Saccharomyces
|
|
365
|
|
366 Other Bioperl developers contributed ideas including Ewan Birney, Ian Korf,
|
|
367 Chris Dagdigian, Georg Fuellen, and Steven Brenner.
|
|
368
|
|
369 =head1 COPYRIGHT
|
|
370
|
|
371 Copyright (c) 1996-98 Steve Chervitz. All Rights Reserved.
|
|
372 This module is free software; you can redistribute it and/or
|
|
373 modify it under the same terms as Perl itself.
|
|
374
|
|
375 =cut
|
|
376
|
|
377
|
|
378 #
|
|
379 ##
|
|
380 ###
|
|
381 #### END of main POD documentation. '
|
|
382 ###
|
|
383 ##
|
|
384 #
|
|
385
|
|
386
|
|
387 =head1 APPENDIX
|
|
388
|
|
389 Methods beginning with a leading underscore are considered private
|
|
390 and are intended for internal use by this module. They are
|
|
391 B<not> considered part of the public interface and are described here
|
|
392 for documentation purposes only.
|
|
393
|
|
394 =cut
|
|
395
|
|
396 #
|
|
397 # This object is deprecated as the root of the inheritance tree, but some
|
|
398 # modules depend on it as a legacy. We issue a deprecation warning for all
|
|
399 # other modules.
|
|
400 #
|
|
401 my @inheriting_modules = ('Bio::Tools::Blast', 'Bio::Root::Object',
|
|
402 'Bio::Root::IOManager');
|
|
403
|
|
404
|
|
405 #######################################################
|
|
406 # CONSTRUCTOR/DESTRUCTOR #
|
|
407 #######################################################
|
|
408
|
|
409
|
|
410 =head2 new
|
|
411
|
|
412 Purpose : Creates a blessed object reference (hash) for the indicated class
|
|
413 : and calls _initialize() for the class passing it all parameters.
|
|
414 Usage : new CLASS_NAME [ %named_parameters];
|
|
415 Example : $obj = new Bio::Root::Object 'george';
|
|
416 : $obj = Bio::Root::Object->new(-name => 'L56163',
|
|
417 : -parent => $obj2 );
|
|
418 : $obj = Bio::Root::Object->new();
|
|
419 Returns : Blessed hash reference.
|
|
420 Argument : Named parameters: (PARAMETER TAGS CAN BE UPPER OR LOWERCASE).
|
|
421 : (all are optional)
|
|
422 : -NAME => arbitrary string to identify an object;
|
|
423 : should be unique within its class.
|
|
424 : -PARENT => blessed reference for an object that
|
|
425 : is responsible for the present object
|
|
426 : (e.g., a container).
|
|
427 : -MAKE => string to specify special constructor option.
|
|
428 : -OBJ => object reference for an object to be cloned.
|
|
429 : -RECORD_ERR => boolean (if true, attach all Err.pm objects generated by
|
|
430 : warn() or throw() calls to the present object;
|
|
431 : default = false).
|
|
432 :
|
|
433 : The use of STRICT and VERBOSE in constructors is no longer
|
|
434 : necessary since there is no object-specific strict or verbose setting.
|
|
435 : Use the strictness() and verbosity() functions exported by
|
|
436 : Bio::Root::Global.pm. These options are still provided
|
|
437 : in the constructor but the will affect *all* objects within a
|
|
438 : given process.
|
|
439 :
|
|
440 : -STRICT => integer (level of strictness: -2, -1, 0, 1, 2).
|
|
441 : -VERBOSE => integer (level of verbosity: -1, 0, 1)
|
|
442 : Verbosity can be used to control how much reporting
|
|
443 : an object should do generally. In this module,
|
|
444 : verbosity affects the behavior of throw() and warn()
|
|
445 : only.
|
|
446 :
|
|
447 :
|
|
448 Comments : This method creates blessed HASH references.
|
|
449 : An object is free to define its own strict, and verbose
|
|
450 : behavior as well as its own make (constructor) options.
|
|
451
|
|
452 See Also : L<_initialize()|_initialize>, L<name()|name>, L<parent()|parent>, L<make()|make>, L<strict()|strict>, L<verbose()|verbose>, L<record_err()|record_err>, and Bio::Root::Root::throw() and Bio::Root::Root::warn() in L<Bio::Root::Root>
|
|
453
|
|
454 =cut
|
|
455
|
|
456 #----------
|
|
457 sub new {
|
|
458 #----------
|
|
459 my($class, @param) = @_;
|
|
460 my $self = {};
|
|
461 bless $self, ref($class) || $class;
|
|
462 $DEBUG==2 && print STDERR "CREATING $self";
|
|
463 $self->_initialize(@param);
|
|
464 $self;
|
|
465 }
|
|
466
|
|
467
|
|
468 =head2 _initialize
|
|
469
|
|
470 Purpose : Initializes key Bio::Root::Object.pm data (name, parent, make, strict).
|
|
471 : Called by new().
|
|
472 Usage : n/a; automatically called by Bio::Root::Object::new()
|
|
473 Returns : String containing the -MAKE constructor option or 'default'
|
|
474 : if none defined (if a -MAKE parameter is defined, the value
|
|
475 : returned will be that obtained from the make() method.)
|
|
476 : This return value saves any subclass from having to call
|
|
477 : $self->make() during construction. For example, within a
|
|
478 : subclass _initialize() method, invoke the Bio::Root::Object::
|
|
479 : initialize() method as follows:
|
|
480 : my $make = $self->SUPER::_initialize(@param);
|
|
481 Argument : Named parameters passed from new()
|
|
482 : (PARAMETER TAGS CAN BE ALL UPPER OR ALL LOWER CASE).
|
|
483 Comments : This method calls name(), make(), parent(), strict(), index()
|
|
484 : and thus enables polymorphism on these methods. To save on method
|
|
485 : call overhead, these methods are called only if the data need
|
|
486 : to be set.
|
|
487 :
|
|
488 : The _set_clone() method is called if the -MAKE option includes
|
|
489 : the string 'clone' (e.g., -MAKE => 'clone').
|
|
490 :
|
|
491 : The index() method is called if the -MAKE option includes
|
|
492 : the string 'index'. (This is an experimental feature)
|
|
493 : (Example: -MAKE => 'full_index').
|
|
494 :
|
|
495 : NOTE ON USING _rearrange():
|
|
496 :
|
|
497 : _rearrange() is a handy method for working with tagged (named)
|
|
498 : parameters and it permits case-insensitive in tag names
|
|
499 : as well as handling tagged or un-tagged parameters.
|
|
500 : _initialize() does not currently call _rearrange() since
|
|
501 : there is a concern about performance when setting many objects.
|
|
502 : One issue is that _rearrange() could be called with many elements
|
|
503 : yet the caller is interested in only a few. Also, derived objects
|
|
504 : typically invoke _rearrange() in their constructors as well.
|
|
505 : This could particularly degrade performance when creating lots
|
|
506 : of objects with extended inheritance hierarchies and lots of tagged
|
|
507 : parameters which are passes along the inheritance hierarchy.
|
|
508 :
|
|
509 : One thing that may help is if _rearrange() deleted all parameters
|
|
510 : it extracted. This would require passing a reference to the param list
|
|
511 : and may add excessive dereferencing overhead.
|
|
512 : It also would cause problems if the same parameters are used by
|
|
513 : different methods or objects.
|
|
514
|
|
515 See Also : L<new()|new>, L<make()|make>, L<name()|name>, L<parent()|parent>, L<strict()|strict>, L<index()|index>, L<verbose()|verbose>
|
|
516
|
|
517 =cut
|
|
518
|
|
519 #----------------
|
|
520 sub _initialize {
|
|
521 #----------------
|
|
522 local($^W) = 0;
|
|
523 my($self, %param) = @_;
|
|
524
|
|
525 if(! grep { ref($self) =~ /$_/; } @inheriting_modules) {
|
|
526 $self->warn("Class " . ref($self) .
|
|
527 " inherits from Bio::Root::Object, which is deprecated. ".
|
|
528 "Try changing your inheritance to Bio::Root::Root.");
|
|
529 }
|
|
530 my($name, $parent, $make, $strict, $verbose, $obj, $record_err) = (
|
|
531 ($param{-NAME}||$param{'-name'}), ($param{-PARENT}||$param{'-parent'}),
|
|
532 ($param{-MAKE}||$param{'-make'}), ($param{-STRICT}||$param{'-strict'}),
|
|
533 ($param{-VERBOSE}||$param{'-verbose'}),
|
|
534 ($param{-OBJ}||$param{'-obj'}, $param{-RECORD_ERR}||$param{'-record_err'})
|
|
535 );
|
|
536
|
|
537 ## See "Comments" above regarding use of _rearrange().
|
|
538 # $self->_rearrange([qw(NAME PARENT MAKE STRICT VERBOSE OBJ)], %param);
|
|
539
|
|
540 $DEBUG and do{ print STDERR ">>>> Initializing $ID (${\ref($self)}) ",$name||'anon';<STDIN>};
|
|
541
|
|
542 if(defined($make) and $make =~ /clone/i) {
|
|
543 $self->_set_clone($obj);
|
|
544
|
|
545 } else {
|
|
546 $name ||= ($#_ == 1 ? $_[1] : ''); # If a single arg is given, use as name.
|
|
547
|
|
548 ## Another performance issue: calling name(), parent(), strict(), make()
|
|
549 ## Any speed diff with conditionals to avoid method calls?
|
|
550
|
|
551 $self->name($name) if $name;
|
|
552 $self->parent($parent) if $parent;
|
|
553 $self->{'_strict'} = $strict || undef;
|
|
554 $self->{'_verbose'} = $verbose || undef;
|
|
555 $self->{'_record_err'} = $record_err || undef;
|
|
556
|
|
557 if($make) {
|
|
558 $make = $self->make($make);
|
|
559
|
|
560 # Index the Object in the global object hash only if requested.
|
|
561 # This feature is not used much. If desired, an object can always
|
|
562 # call Bio::Root::Object::index() any time after construction.
|
|
563 $self->index() if $make =~ /index/;
|
|
564 }
|
|
565 }
|
|
566
|
|
567 $DEBUG and print STDERR "---> Initialized $ID (${\ref($self)}) ",$name,"\n";
|
|
568
|
|
569 ## Return data of potential use to subclass constructors.
|
|
570 # return (($make || 'default'), $strict); # maybe (?)
|
|
571 return $make || 'default';
|
|
572 }
|
|
573
|
|
574
|
|
575
|
|
576 =head2 DESTROY
|
|
577
|
|
578 Purpose : Provides indication that the object is being reclaimed
|
|
579 : by the GC for debugging purposes only.
|
|
580 Usage : n/a; automatically called by Perl when the ref count
|
|
581 : on the object drops to zero.
|
|
582 Argument : n/a
|
|
583 Comments : Setting the global $DEBUG to 2 will print messages upon
|
|
584 : object destruction.
|
|
585 : Subclasses should override this method to
|
|
586 : clean up any resources (open file handles, etc.)
|
|
587 : The overridden method should end with a call to
|
|
588 : SUPER::DESTROY;
|
|
589
|
|
590 See Also : L<destroy()|destroy>
|
|
591
|
|
592 =cut
|
|
593
|
|
594 #-----------
|
|
595 sub DESTROY {
|
|
596 #-----------
|
|
597 my $self=shift;
|
|
598
|
|
599 $DEBUG==2 && print STDERR "DESTROY called in $ID for ${\$self->to_string} ($self)\n";
|
|
600 }
|
|
601
|
|
602
|
|
603 =head2 destroy
|
|
604
|
|
605 Purpose : Clean up any resources allocated by the object and
|
|
606 : remove links to all objects connected to the present
|
|
607 : object with the ultimate aim of signaling the GC to
|
|
608 : reclaim all memory allocated for the object.
|
|
609 : This method breaks links to any Err, IOManager, and Xref objects
|
|
610 : and drops the present object as a child from any parent objects.
|
|
611 Usage : $object->destroy(); undef $object;
|
|
612 : undef-ing the object reference signals the GC to reclaim
|
|
613 : the object's memory.
|
|
614 Returns : undef
|
|
615 Argument : n/a
|
|
616 Comments : Circular reference structures are problematic for garbage
|
|
617 : collection schemes such as Perl's which are based on reference
|
|
618 : counting. If you create such structures outside of
|
|
619 : the parent-child relationship, be sure to properly break
|
|
620 : the circularity when destroying the object.
|
|
621 : Subclasses should override this method to call destroy()
|
|
622 : on any contained child objects. The overridden method
|
|
623 : should end with a call to SUPER::destroy().
|
|
624 Bugs : Bio::Root::Xref.pm objects have not been tested and
|
|
625 : may not be handled properly here.
|
|
626 : Bio::Root::Vector.pm objects are also not yet handled
|
|
627 : properly so beware of crunching lots of Vector objects.
|
|
628
|
|
629 =cut
|
|
630
|
|
631 #-------------'
|
|
632 sub destroy {
|
|
633 #-------------
|
|
634 ## Note: Cannot delete parent and xref object refs since they are not
|
|
635 ## owned by this object, merely associated with it.
|
|
636 my $self = shift;
|
|
637
|
|
638 if(ref($self->{'_parent'})) {
|
|
639 $self->{'_parent'}->_drop_child($self);
|
|
640 undef $self->{'_parent'};
|
|
641 }
|
|
642
|
|
643 if(ref($self->{'_io'})) {
|
|
644 $self->{'_io'}->destroy;
|
|
645 undef $self->{'_io'};
|
|
646 }
|
|
647
|
|
648 if(ref($self->{'_err'})) {
|
|
649 $self->{'_err'}->remove_all;
|
|
650 undef $self->{'_err'};
|
|
651 }
|
|
652
|
|
653 if(ref($self->{'_xref'})) {
|
|
654 $self->{'_xref'}->remove_all;
|
|
655 undef $self->{'_xref'};
|
|
656 }
|
|
657
|
|
658 $self->_remove_from_index if scalar %Objects_created;
|
|
659 }
|
|
660
|
|
661
|
|
662 =head2 _drop_child
|
|
663
|
|
664 Usage : $object->_drop_child(object_ref)
|
|
665 : Used internally by destroy().
|
|
666 Purpose : To remove a parent-to-child inter-object relationship.
|
|
667 : The aim here is to break cyclical object refs to permit Perl's
|
|
668 : GC to reclaim the object's memory. The expectation is that
|
|
669 : a child object requests of its parent that the parent drop the
|
|
670 : child object making the request. Parents do not drop children
|
|
671 : unless requested by the child in question.
|
|
672 Example : $self->parent->_drop_child($self);
|
|
673 Returns : undef
|
|
674 Argument : Object reference for the child object to be dropped
|
|
675 Throws : Exception if an object ref is not provided as an argument.
|
|
676 Comments : This is a simplistic version that systematically checks every
|
|
677 : data member, searching all top-level array, hash, and scalar
|
|
678 : data members.
|
|
679 : It does not recurse through all levels of complex data members.
|
|
680 : Subclasses could override this method to handle complex child
|
|
681 : data members for more optimal child searching. However, the
|
|
682 : version here is probably sufficient for most situations.
|
|
683 :
|
|
684 : _drop_child() is called by Bio::Root::Object::destroy() for
|
|
685 : all objects with parents.
|
|
686 Status : Experimental
|
|
687
|
|
688 See Also : L<destroy()|destroy>
|
|
689
|
|
690 =cut
|
|
691
|
|
692 #---------------'
|
|
693 sub _drop_child {
|
|
694 #---------------
|
|
695 my ($self, $child) = @_;
|
|
696 my ($member, $found);
|
|
697
|
|
698 $self->throw("Child not defined or not an object ($child).") unless ref $child;
|
|
699
|
|
700 local($^W = 0);
|
|
701 foreach $member (keys %{$self}) {
|
|
702 next unless ref($self->{$member});
|
|
703 # compare references.
|
|
704 if (ref($self->{$member}) eq 'ARRAY') {
|
|
705 my ($i);
|
|
706 for($i=0; $i < @{$self->{$member}}; $i++) {
|
|
707 if ($self->{$member}->[$i] eq $child) {
|
|
708 $DEBUG==2 && print STDERR "Removing array child $child\n";
|
|
709 undef $self->{$member}->[$i];
|
|
710 $found = 1; last;
|
|
711 }
|
|
712 }
|
|
713 } elsif(ref($self->{$member}) eq 'HASH') {
|
|
714 foreach(keys %{$self->{$member}}) {
|
|
715 if ($self->{$member}->{$_} eq $child) {
|
|
716 $DEBUG==2 && print STDERR "Removing hash child $child\n";
|
|
717 undef $self->{$member}->{$_};
|
|
718 $found = 1; last;
|
|
719 }
|
|
720 }
|
|
721 } else {
|
|
722 if ($self->{$member} eq $child) {
|
|
723 $DEBUG==2 && print STDERR "Removing child $child\n";
|
|
724 undef $self->{$member};
|
|
725 $found = 1; last;
|
|
726 }
|
|
727 }
|
|
728 }
|
|
729 # Child not found:
|
|
730 # It is possible that a child object has a parent but has not yet been added to
|
|
731 # the parent due to a failure during construction of the child. Not warning.
|
|
732 #$self->warn(sprintf "Child %s not found in Parent %s.", $child->to_string, $self->to_string) unless $found;
|
|
733
|
|
734 undef;
|
|
735 }
|
|
736
|
|
737
|
|
738 #################################################################
|
|
739 # ACCESSORS & INSTANCE METHODS
|
|
740 #################################################################
|
|
741
|
|
742
|
|
743
|
|
744 =head2 name
|
|
745
|
|
746 Usage : $object->name([string]);
|
|
747 Purpose : Set/Get an object's common name.
|
|
748 Example : $myName = $myObj->name;
|
|
749 : $myObj->name('fred');
|
|
750 Returns : String consisting of the object's name or
|
|
751 : "anonymous <CLASSNAME>" if name is not set.
|
|
752 : Thus, this method ALWAYS returns some string.
|
|
753 Argument : String to be used as the common name of the object.
|
|
754 : Should be unique within its class.
|
|
755
|
|
756 See also : L<has_name()|has_name>
|
|
757
|
|
758 =cut
|
|
759
|
|
760 #---------
|
|
761 sub name {
|
|
762 #---------
|
|
763 my $self = shift;
|
|
764
|
|
765 # $DEBUG and do{ print STDERR "\n$ID: name(@_) called.";<STDIN>; };
|
|
766
|
|
767 if (@_) { $self->{'_name'} = shift }
|
|
768 return defined $self->{'_name'} ? $self->{'_name'} : 'anonymous '.ref($self);
|
|
769 }
|
|
770
|
|
771
|
|
772 =head2 to_string
|
|
773
|
|
774 Usage : $object->to_string();
|
|
775 Purpose : Get an object as a simple string useful for debugging purposes.
|
|
776 Example : print $myObj->to_string; # prints: Object <PACKAGE NAME> "<OBJECT NAME>"
|
|
777 Returns : String consisting of the package name + object's name
|
|
778 : Object's name is obtained by calling the name() method.
|
|
779 Argument : n/a
|
|
780 Throws : n/a
|
|
781
|
|
782 See also : L<name()|name>
|
|
783
|
|
784 =cut
|
|
785
|
|
786 #-------------
|
|
787 sub to_string {
|
|
788 #-------------
|
|
789 my $self = shift;
|
|
790 return sprintf "Object %s \"%s\"", ref($self), $self->name;
|
|
791 }
|
|
792
|
|
793
|
|
794 =head2 parent
|
|
795
|
|
796 Usage : $object->parent([object | 'null']);
|
|
797 Purpose : Set/Get the current object's source object.
|
|
798 : An object's source object (parent) is defined as the object
|
|
799 : that is responsible for creating the current object (child).
|
|
800 : The parent object may also have a special mechanism for
|
|
801 : destroying the child object. This should be included
|
|
802 : in the parent object's DESTROY method which should end with a
|
|
803 : call to $self->SUPER::DESTROY.
|
|
804 Example : $myObj->parent($otherObject);
|
|
805 Returns : Object reference for the parent object or undef if none is set.
|
|
806 Argument : Blessed object reference (optional) or the string 'null'.
|
|
807 : 'null' = sets the object's _parent field to undef,
|
|
808 : breaking the child object's link to its parent.
|
|
809 Throws : Exception if argument is not an object reference or 'null'.
|
|
810 Comments : This method may be renamed 'parent' in the near future.
|
|
811 : When and if this happens, parent() will still be supported but
|
|
812 : will be deprecated.
|
|
813
|
|
814 See also : L<destroy()|destroy>
|
|
815
|
|
816 =cut
|
|
817
|
|
818 #------------'
|
|
819 sub parent {
|
|
820 #------------
|
|
821 my ($self) = shift;
|
|
822 if (@_) {
|
|
823 my $arg = shift;
|
|
824 if(ref $arg) {
|
|
825 $self->{'_parent'} = $arg;
|
|
826 } elsif($arg =~ /null/i) {
|
|
827 $self->{'_parent'} = undef;
|
|
828 } else {
|
|
829 $self->throw("Can't set parent using $arg: Not an object");
|
|
830 }
|
|
831 }
|
|
832 $self->{'_parent'};
|
|
833 }
|
|
834
|
|
835
|
|
836 =head2 src_obj
|
|
837
|
|
838 Usage : $object->src_obj([object | 'null']);
|
|
839 : THIS METHOD IS NOW DEPRECATED. USE parent() INSTEAD.
|
|
840 Purpose : Set/Get the current object's source object (parent).
|
|
841
|
|
842 See also : L<parent()|parent>
|
|
843
|
|
844 =cut
|
|
845
|
|
846 #------------'
|
|
847 sub src_obj {
|
|
848 #------------
|
|
849 my ($self) = shift;
|
|
850 $self->warn("DEPRECATED METHOD src_obj() CALLED. USE parent() INSTEAD.\n");
|
|
851 $self->parent(@_);
|
|
852 }
|
|
853
|
|
854
|
|
855 =head2 has_name
|
|
856
|
|
857 Usage : $object->has_name();
|
|
858 Purpose : To determine if an object has a name.
|
|
859 Returns : True (1) if the object's {'Name'} data member is defined.
|
|
860 : False otherwise.
|
|
861 Comments : One may argue, why not just use the name() method as a
|
|
862 : combination setter/getter? has_name() is necessary for
|
|
863 : the following reasons:
|
|
864 : (1) If an object's name is not defined, name() returns
|
|
865 : "anonymous <CLASSNAME>".
|
|
866 : (2) If an object's name is 0 (zero) or '' (empty string),
|
|
867 : conditionals that simply check name() would fail incorrectly.
|
|
868
|
|
869 See also : L<name()|name>
|
|
870
|
|
871 =cut
|
|
872
|
|
873 #--------------'
|
|
874 sub has_name { my $self = shift; return defined $self->{'_name'}; }
|
|
875 #--------------
|
|
876
|
|
877
|
|
878
|
|
879 =head2 make
|
|
880
|
|
881 Usage : $object->make([string]);
|
|
882 Purpose : Set/Get an object's constructor option.
|
|
883 : make() is intended for use during object construction
|
|
884 : to essentially permit alternate constructors since
|
|
885 : Perl doesn't have a built-in mechanism for this.
|
|
886 Example : $make = $object->make();
|
|
887 : $object->make('optionA');
|
|
888 Returns : String consisting of the object's make option
|
|
889 : or 'default' if make is not set.
|
|
890 : Thus, this method ALWAYS returns some string.
|
|
891 Argument : String to be used as an option during object construction.
|
|
892 Comments : A typical use of a make option is when cloning an object
|
|
893 : from an existing object. In this case, the new() method
|
|
894 : is called with -MAKE => 'clone'.
|
|
895
|
|
896 See also : L<_initialize()|_initialize>, L<clone()|clone>
|
|
897
|
|
898 =cut
|
|
899
|
|
900 #----------'
|
|
901 sub make {
|
|
902 #----------
|
|
903 my $self = shift;
|
|
904 if(@_) { $self->{'_make'} = shift; }
|
|
905 $self->{'_make'} || 'default';
|
|
906 }
|
|
907
|
|
908
|
|
909 =head2 err
|
|
910
|
|
911 Usage : $self->err([$data], [$delimit])
|
|
912 Purpose : Check for exceptions/warnings and get data about them.
|
|
913 : (object validation and error data retrieval)
|
|
914 Example : $self->err && print "has err";
|
|
915 : $errCount = $self->err('count');
|
|
916 : $errMsgs = $self->err('msg',"\t");
|
|
917 : @errNotes = $self->err('note');
|
|
918 Returns : One of the following:
|
|
919 : 1. If no arguments are given
|
|
920 : a. If the object has an error, the err data member is
|
|
921 : returned (this is an Bio::Root::Err.pm object),
|
|
922 : b. otherwise, undef is returned.
|
|
923 : 2. The number of Errs in the object's err data member (if $data eq 'count').
|
|
924 : 3. A string containing data from a specific field from an object's err member.
|
|
925 : -- If the object contains multiple errors, data for all errors will be
|
|
926 : strung together in reverse chronological order with each error's data
|
|
927 : preceeded by "Error #n\n" and followed by two delimiters.
|
|
928 : 4. A list containing data from a specific field from an object's err member.
|
|
929 : -- If the object contains multiple errors, data for all errors will be
|
|
930 : added in reverse chronological order as separate elements in the list
|
|
931 : with NO "Error #n\n" identifier. Individual err list data
|
|
932 : (note,tech,stack) will be tab-delimited.
|
|
933 Arguments : $data = The name of a specific Err data member (see %Bio::Root::Err::ERR_FIELDS)
|
|
934 : OR 'count'.
|
|
935 : $delimit = The delimiter separating a single Err's list data member's elements.
|
|
936 : Default is "\n". For multi-error objects, two of these
|
|
937 : delimiters separate data from different errors.
|
|
938 : If wantarray is true or delimiter is 'list', data from multiple
|
|
939 : errors will be returned as a list
|
|
940 :
|
|
941 Comments : Since Err objects are now fatal and are not attached to the object by default,
|
|
942 : this method is largely moot. It is a relic from the former
|
|
943 : error "polling" days.
|
|
944 : It is handy for accessing non-fatal warnings thrown by the object,
|
|
945 : or in situations where fatal errors are converted to warnings
|
|
946 : as when $self->strict is -1 or $WARN_ON_FATAL is true.
|
|
947 : (Note: an object now only attaches Err objects to itself when
|
|
948 : constructed with -RECORD_ERR =>1 or if the global $RECORD_ERR is true).
|
|
949 :
|
|
950 : This method is intended mainly to test whether or not an object
|
|
951 : has any Err objects associated with it and if so, obtaining the
|
|
952 : Err object or specific data about it.
|
|
953 : For obtaining ALL data about an error, use err_string().
|
|
954 : For more detailed manipulations with the Err data, retrieve the
|
|
955 : Err object and process its data as necessary.
|
|
956
|
|
957 See also : L<err_string()|err_string>, L<print_err()|print_err>, L<Bio::Root::Err::get_all|Bio::Root::Err>
|
|
958
|
|
959 =cut
|
|
960
|
|
961 #----------
|
|
962 sub err {
|
|
963 #----------
|
|
964 my( $self, $data, $delimit) = @_;
|
|
965
|
|
966 return undef unless defined $self->{'_err'};
|
|
967
|
|
968 $data ||= 'member';
|
|
969 # $delimit ||= (wantarray ? 'list' : "\n");
|
|
970 $delimit ||= "\n";
|
|
971
|
|
972 $data eq 'member' and return $self->{'_err'};
|
|
973 $data eq 'count' and return $self->{'_err'}->size();
|
|
974
|
|
975 return $self->{'_err'}->get_all($data, $delimit );
|
|
976 }
|
|
977
|
|
978
|
|
979 =head2 record_err
|
|
980
|
|
981 Usage : $object->record_err([0|1]);
|
|
982 Purpose : Set/Get indicator for whether an object should save
|
|
983 : the Bio::Root::Err.pm objects it generates via calls
|
|
984 : to throw() or warn().
|
|
985 Example : $myObj->record_err(1)
|
|
986 Returns : Boolean (0|1)
|
|
987 Argument : Boolean (0|1)
|
|
988 Comments : Record_err is generally useful only for examining
|
|
989 : warnings produced by an object, since calls to throw()
|
|
990 : are normally fatal (unless strictness is set to -2).
|
|
991 : To turn on recording of errors for all objects in a process,
|
|
992 : use Bio::Root::Global::record_err().
|
|
993 Status : Experimental
|
|
994
|
|
995 See also : L<err()|err>, and record_err() in L<Bio::Root::Err>
|
|
996
|
|
997 =cut
|
|
998
|
|
999 #---------------
|
|
1000 sub record_err {
|
|
1001 #---------------
|
|
1002 my $self = shift;
|
|
1003
|
|
1004 if (@_) { $self->{'_record_err'} = shift }
|
|
1005 return $self->{'_record_err'} || 0;
|
|
1006 }
|
|
1007
|
|
1008
|
|
1009 =head2 err_state
|
|
1010
|
|
1011 Usage : $object->err_state();
|
|
1012 Purpose : To assess the status of the object's Err object (if any).
|
|
1013 Returns : A string: 'EXCEPTION' | 'WARNING' | 'FATAL' | 'OKAY'
|
|
1014 : (OKAY is returned if there are no Errors)
|
|
1015 Status : Experimental
|
|
1016
|
|
1017 =cut
|
|
1018
|
|
1019 #-------------'
|
|
1020 sub err_state {
|
|
1021 #-------------
|
|
1022 my $self = shift;
|
|
1023 return 'OKAY' if not defined $self->{'_err'};
|
|
1024 $self->{'_errState'} || 'OKAY';
|
|
1025 }
|
|
1026
|
|
1027
|
|
1028 =head2 clear_err
|
|
1029
|
|
1030 Purpose : To remove any error associated with the given object.
|
|
1031 Usage : $myObj->clear_err;
|
|
1032
|
|
1033 See also : L<err()|err>
|
|
1034
|
|
1035 =cut
|
|
1036
|
|
1037 #-------------
|
|
1038 sub clear_err {
|
|
1039 #-------------
|
|
1040 my $self = shift;
|
|
1041 undef $self->{'_err'};
|
|
1042 }
|
|
1043
|
|
1044
|
|
1045
|
|
1046
|
|
1047
|
|
1048 =head2 containment
|
|
1049
|
|
1050 Usage : $aref = $object->containment();
|
|
1051 : Since this method can be exported, the following can be used:
|
|
1052 : $aref = containment($object);
|
|
1053 Purpose : To determine the containment hierarchy of a object.
|
|
1054 Returns : An array reference in which each element is a string
|
|
1055 : containing the class and name of
|
|
1056 : the object in which this object is contained.
|
|
1057 : Indentation increases progressively as the
|
|
1058 : hierarchy is traversed.
|
|
1059 : E.g., Object MyClass "Foo"
|
|
1060 : Contained in object YourClass "Bar"
|
|
1061 : Contained in object HisClass "Moo"
|
|
1062 Comments : This method will report only one object at each level
|
|
1063 : since an object can currently have only one source object.
|
|
1064 Status : Exported
|
|
1065
|
|
1066 See also : L<err()|err>
|
|
1067
|
|
1068 =cut
|
|
1069
|
|
1070 #------------------
|
|
1071 sub containment {
|
|
1072 #------------------
|
|
1073 my( $self) = @_;
|
|
1074 my(@hierarchy);
|
|
1075
|
|
1076 # print "$ID: getting err hierarchy.\n";
|
|
1077 push @hierarchy, $self->to_string;
|
|
1078 my $obj = $self;
|
|
1079 my $count = 0;
|
|
1080
|
|
1081 while( ref $obj->parent) {
|
|
1082 $obj = $obj->parent;
|
|
1083 push @hierarchy, sprintf "%sContained in %s", ' ' x ++$count, $obj->to_string;
|
|
1084 }
|
|
1085 return \@hierarchy;
|
|
1086 }
|
|
1087
|
|
1088
|
|
1089 =head2 set_stats
|
|
1090
|
|
1091 Usage : $object->set_stats(KEY => DATA [,KEY2 => DATA2])
|
|
1092 Purpose : To declare and initialize a set of statistics germain
|
|
1093 : to an object. Each statistic name becomes a data member
|
|
1094 : prefixed with an underscore (if not already) and first
|
|
1095 : character after the underscore is lowercased.
|
|
1096 Example : $object->set_stats('num_A' =>1,
|
|
1097 : 'Num_B' =>10 ):
|
|
1098 : This sets :
|
|
1099 : $object->{'_num_A'} = 1
|
|
1100 : $object->{'_num_B'} = 10;
|
|
1101 Returns : n/a
|
|
1102 Comments : This method implements a convention for naming Perl
|
|
1103 : object data members with a leading underscore,
|
|
1104 : consistent with the naming convention of private methods.
|
|
1105 : Data members should not be part of an object's public
|
|
1106 : interface. The leading underscore helps flag the members
|
|
1107 : as private and also prevents inadvertant clobbering.
|
|
1108
|
|
1109 =cut
|
|
1110
|
|
1111 #--------------'
|
|
1112 sub set_stats {
|
|
1113 #--------------
|
|
1114 my( $self, %param ) = @_;
|
|
1115
|
|
1116 my ($val);
|
|
1117 foreach (keys %param) {
|
|
1118 $val = $param{$_};;
|
|
1119 s/^(\w)/_\l$1/;
|
|
1120 $self->{$_} = $val;
|
|
1121 }
|
|
1122 }
|
|
1123
|
|
1124
|
|
1125 =head2 strict
|
|
1126
|
|
1127 Usage : $object->strict( [-2|-1|0|1|2] );
|
|
1128 : warn $message if $object->strict > 0;
|
|
1129 Purpose : To make the object hyper- or hyposensitive to exceptions & warnings.
|
|
1130 : Strict = 2 : extremely hyper-sensitive, converts warn() into throw().
|
|
1131 : Strict = 1 : hyper-sensitive, but calls to warn are not converted.
|
|
1132 : Strict = 0 : no change (throw() = fatal, warn() = non-fatal).
|
|
1133 : Strict = -1 : hypo-sensitive, but calls to throw are not converted.
|
|
1134 : Strict = -2 : extremely hypo-sensitive, converts throw() into warn()
|
|
1135 :
|
|
1136 : Two degrees of positive and negative values for strict permit
|
|
1137 : the following functionality:
|
|
1138 : 1. Setting strict to 2 or -2 leads to more dramatic strictness
|
|
1139 : or permissiveness, respectively. With 2, all calls to warn()
|
|
1140 : become calls to throw() and are therefore fatal. With -2,
|
|
1141 : the opposite is true and calls to throw become non-fatal.
|
|
1142 : A strict value of 2 is thus an object-level version of
|
|
1143 : Perl's "use strict" pragma.
|
|
1144 :
|
|
1145 : 2. Setting strict to 1 or -1 does not affect the behavior of
|
|
1146 : throw() and warn(). This allows an object to implement its
|
|
1147 : its own strictness policy. A strict value of 1 is thus an
|
|
1148 : an object-level version of Perl's -w flag.
|
|
1149 :
|
|
1150 Returns : Integer between -2 to 2.
|
|
1151 Comments : This method no longer accesses an object-specific strictness
|
|
1152 : level but rather the global $STRICTNESS variable
|
|
1153 : defined in Bio::Root::Global.pm and accessed via the
|
|
1154 : strictness() method exported by that package.
|
|
1155 : Thus, all objects share the same strictness which
|
|
1156 : is generally more convenient.
|
|
1157 Status : Experimental
|
|
1158
|
|
1159 See also : warn() and throw() in L<Bio::Root::Root>, L<STRICTNESS & VERBOSITY>, strictness() in L<Bio::Root::Global>
|
|
1160
|
|
1161 =cut
|
|
1162
|
|
1163 #------------
|
|
1164 sub strict {
|
|
1165 #------------
|
|
1166 my $self = shift;
|
|
1167
|
|
1168 # Use global strictness?
|
|
1169 if( $self->{'_use_global_strictness'}) {
|
|
1170 return &strictness(@_);
|
|
1171 }
|
|
1172 else {
|
|
1173 # Object-specific strictness
|
|
1174 if (@_) { $self->{'_strict'} = shift; }
|
|
1175 defined($self->{'_strict'})
|
|
1176 ? return $self->{'_strict'}
|
|
1177 : (ref $self->{'_parent'} ? $self->{'_parent'}->strict : 0);
|
|
1178 }
|
|
1179 }
|
|
1180
|
|
1181 =head2 use_global_strictness
|
|
1182
|
|
1183 Usage : $object->use_global_strictnness( [1|0] );
|
|
1184 Purpose : Set/Get accessor for a flag indicating whether or not
|
|
1185 : to use the global strictness setting or to instead use
|
|
1186 : object-specific strictness.
|
|
1187 Returns : Boolean
|
|
1188 Comments :
|
|
1189 Status : Experimental
|
|
1190
|
|
1191 See also : L<strict()|strict>, L<STRICTNESS & VERBOSITY>, strictness() in L<Bio::Root::Global>
|
|
1192
|
|
1193 =cut
|
|
1194
|
|
1195 sub use_global_strictness {
|
|
1196 my ($self, $value) = @_;
|
|
1197
|
|
1198 if( defined $value ) {
|
|
1199 $self->{'_use_global_strictness'} = $value;
|
|
1200 }
|
|
1201
|
|
1202 return $self->{'_use_global_strictness'};
|
|
1203 }
|
|
1204
|
|
1205
|
|
1206 =head2 clone
|
|
1207
|
|
1208 Purpose : To deeply copy an object.
|
|
1209 : Creates a new object reference containing an exact
|
|
1210 : copy of an existing object and all its data members.
|
|
1211 Usage : $myClone = $myObj->clone;
|
|
1212 Comments : This method only clones the Bio::Root::Object data members.
|
|
1213 : To fully clone an object that has data members beyond
|
|
1214 : those inherited from Bio::Root::Object, you must provide a
|
|
1215 : constructor in your class to copy all data of an object
|
|
1216 : data into the clone. For an example, see how _set_clone()
|
|
1217 : is called by _initialize() in this class.
|
|
1218 :
|
|
1219 : clone() will pass the named parameters {-MAKE=>'clone'}
|
|
1220 : and {-OBJ=>$self} to the object's constructor. The
|
|
1221 : constructor should then either check the -MAKE parameter
|
|
1222 : directly or should check the return value from
|
|
1223 : a call to the superclass constructor (see _initialize()
|
|
1224 : for an example) and then copy the required data members from OBJ
|
|
1225 : into the new object, bypassing the normal construction process.
|
|
1226 : Cloning of objects has not been extensively tested.
|
|
1227 : USE WITH CAUTION.
|
|
1228 Status : Experimental
|
|
1229
|
|
1230 See Also : L<_set_clone()|_set_clone>, L<_initialize()|_initialize>
|
|
1231
|
|
1232 =cut
|
|
1233
|
|
1234 #-------------'
|
|
1235 sub clone {
|
|
1236 #-------------
|
|
1237 my($self) = shift;
|
|
1238
|
|
1239 # warn sprintf "\nCloning %s \"%s\"\n\n", ref($self),$self->name;
|
|
1240
|
|
1241 my $clone = $self->new(-MAKE =>'clone',
|
|
1242 -OBJ =>$self);
|
|
1243 if($self->err()) { $clone->err($self->err); }
|
|
1244 $clone;
|
|
1245 }
|
|
1246
|
|
1247
|
|
1248
|
|
1249 =head2 _set_clone
|
|
1250
|
|
1251 Usage : n/a; internal method used by _initialize()
|
|
1252 : $self->_set_clone($object_to_be_cloned)
|
|
1253 Purpose : Deep copy all Bio::Root::Object.pm data members
|
|
1254 : into a new object reference.
|
|
1255 : (This is basically a copy constructor).
|
|
1256 Argument : object ref for object to be cloned.
|
|
1257 Throws : Exception if argument is not an object reference.
|
|
1258 Comments : Data members which are objects are cloned (parent, io, err).
|
|
1259 : Cloning of objects has not been extensively tested.
|
|
1260 : USE WITH CAUTION.
|
|
1261
|
|
1262 See Also : L<_initialize()|_initialize>
|
|
1263
|
|
1264 =cut
|
|
1265
|
|
1266 #----------------
|
|
1267 sub _set_clone {
|
|
1268 #----------------
|
|
1269 my($self, $obj) = @_;
|
|
1270
|
|
1271 ref($obj) || throw($self, "Can't clone $ID object: Not an object ref ($obj)");
|
|
1272
|
|
1273 local($^W) = 0; # suppress 'uninitialized' warnings.
|
|
1274
|
|
1275 $self->{'_name'} = $obj->{'_name'};
|
|
1276 $self->{'_strict'} = $obj->{'_strict'};
|
|
1277 $self->{'_make'} = $obj->{'_make'};
|
|
1278 $self->{'_verbose'} = $obj->{'_verbose'};
|
|
1279 $self->{'_errState'} = $obj->{'_errState'};
|
|
1280 ## Better to use can() with Perl 5.004.
|
|
1281 $self->{'_parent'} = ref($obj->{'_parent'}) and $obj->{'_parent'}->clone;
|
|
1282 $self->{'_io'} = ref($obj->{'_io'}) and $obj->{'_io'}->clone;
|
|
1283 $self->{'_err'} = ref($obj->{'_err'}) and $obj->{'_err'}->clone;
|
|
1284 }
|
|
1285
|
|
1286
|
|
1287
|
|
1288 =head2 verbose
|
|
1289
|
|
1290 Usage : $object->verbose([-1|0|1]);
|
|
1291 Purpose : Set/Get an indicator for how much ruporting an object should do.
|
|
1292 Argument : integer (-1, 0, or 1)
|
|
1293 Returns : integer (-1, 0, or 1)
|
|
1294 : Returns 0 if verbosity has not been defined.
|
|
1295 : Verbosity > 0 indicates extra reporting.
|
|
1296 : Verbosity < 0 indicates minimal reporting.
|
|
1297 : Verbosity = 0 or undefined indicates default reporting.
|
|
1298 Comments : This method no longer accesses an object-specific verbosity
|
|
1299 : level but rather the global $VERBOSITY variable
|
|
1300 : defined in Bio::Root::Global.pm and accessed via the
|
|
1301 : verbosity() method exported by that package.
|
|
1302 : Thus, all objects share the same verbosity which
|
|
1303 : is generally more convenient.
|
|
1304 Status : Experimental
|
|
1305
|
|
1306 See Also : L<strict()|strict>, L<STRICTNESS & VERBOSITY>, verbosity() in L<Bio::Root::Global>
|
|
1307
|
|
1308 =cut
|
|
1309
|
|
1310 #------------
|
|
1311 sub verbose {
|
|
1312 #------------
|
|
1313 my $self = shift;
|
|
1314
|
|
1315 # Using global verbosity
|
|
1316 return &verbosity(@_);
|
|
1317
|
|
1318 # Object-specific verbosity (not used unless above code is commented out)
|
|
1319 if(@_) { $self->{'_verbose'} = shift; }
|
|
1320 defined($self->{'_verbose'})
|
|
1321 ? return $self->{'_verbose'}
|
|
1322 : (ref $self->{'_parent'} ? $self->{'_parent'}->verbose : 0);
|
|
1323 }
|
|
1324
|
|
1325
|
|
1326
|
|
1327 =head1 I/O-RELATED METHODS (Delegated to B<Bio::Root::IOManager>)
|
|
1328
|
|
1329 =head2 _io
|
|
1330
|
|
1331 Usage : $object->_io()
|
|
1332 Purpose : Get the Bio::Root::IOManager.pm object for the current object.
|
|
1333
|
|
1334 See also : L<display()|display>, L<read()|read>, L<file()|file>
|
|
1335
|
|
1336 =cut
|
|
1337
|
|
1338 #-------
|
|
1339 sub _io { my $self = shift; return $self->{'_io'}; }
|
|
1340 #-------
|
|
1341
|
|
1342
|
|
1343
|
|
1344 =head2 _set_io
|
|
1345
|
|
1346 Usage : n/a; internal use only.
|
|
1347 Purpose : Sets a new Bio::Root::IOManager.pm object for the current object.
|
|
1348
|
|
1349 See also : L<display()|display>, L<read()|read>, L<file()|file>
|
|
1350
|
|
1351 =cut
|
|
1352
|
|
1353 #------------
|
|
1354 sub _set_io {
|
|
1355 #------------
|
|
1356 my $self = shift;
|
|
1357
|
|
1358 require Bio::Root::IOManager;
|
|
1359
|
|
1360 # See PR#192.
|
|
1361 # $self->{'_io'} = new Bio::Root::IOManager(-PARENT=>$self, @_);
|
|
1362 $self->{'_io'} = new Bio::Root::IOManager(-PARENT=>$self);
|
|
1363 }
|
|
1364
|
|
1365
|
|
1366
|
|
1367 =head2 set_display
|
|
1368
|
|
1369 Usage : $object->set_display( %named_parameters).
|
|
1370 : See Bio::Root::IOManager::set_display() for a description of parameters.
|
|
1371 Purpose : Sets the output stream for displaying data associated with an object.
|
|
1372 : Delegates to Bio::Root::IOManager::set_display().
|
|
1373 Argument : Named parameters (optional).
|
|
1374 : See Bio::Root::IOManager::set_display() for a
|
|
1375 : description of arguments.
|
|
1376 Status : Experimental
|
|
1377 Comments : Sets the IOManager.pm object if it is not set.
|
|
1378 : I'm not satisfied with the current display()/set_display() strategy.
|
|
1379
|
|
1380 See also : set_display() in L<Bio::Root::IOManager>
|
|
1381
|
|
1382 =cut
|
|
1383
|
|
1384 #----------------'
|
|
1385 sub set_display {
|
|
1386 #----------------
|
|
1387 my($self, @param) = @_;
|
|
1388
|
|
1389 $self->_set_io(@param) if !ref($self->{'_io'});
|
|
1390
|
|
1391 eval { $self->{'_io'}->set_display(@param); };
|
|
1392
|
|
1393 if($@) {
|
|
1394 my $er = $@;
|
|
1395 $self->throw(-MSG=>$er, -NOTE=>"Can't set_display for ${\$self->name}");
|
|
1396 }
|
|
1397
|
|
1398 return $self->{'_io'}->fh;
|
|
1399 }
|
|
1400
|
|
1401
|
|
1402 =head2 display
|
|
1403
|
|
1404 Usage : $object->display( named parameters)
|
|
1405 : See Bio::Root::IOManager::display() for a description of parameters.
|
|
1406 Purpose : Output information about an object's data.
|
|
1407 : Delegates this task to Bio::Root::IOManager::display()
|
|
1408 Argument : Named parameters for IOManager::set_display()
|
|
1409 Status : Experimental
|
|
1410 Comments : Sets the IOManager.pm object if it is not set.
|
|
1411 : IOManager::set_display()is then called on the new IOManager object.
|
|
1412 :
|
|
1413 : The motivation behind the display() method and IOManager.pm
|
|
1414 : is to allow for flexible control over output of an
|
|
1415 : object's data to/from filehandles, pipes, or STDIN/STDOUT,
|
|
1416 : and for passing file handles between objects. Currently,
|
|
1417 : it is used mainly for output to STDOUT.
|
|
1418 :
|
|
1419 : There is some concern whether this much functionality is
|
|
1420 : actually necessary, hence the "Experimental" status of this
|
|
1421 : method.
|
|
1422 :
|
|
1423 : -------
|
|
1424 : It might be worthwhile to also have a string() method
|
|
1425 : that will put an object's data into a string that can be
|
|
1426 : further processed as desired. Stringification for persistence
|
|
1427 : issues might be best handled by Data::Dumper.pm.
|
|
1428 :
|
|
1429 : When overriding this method, use the following syntax:
|
|
1430 :
|
|
1431 : sub display {
|
|
1432 : my ($self, %param) = @_;
|
|
1433 : $self->SUPER::display(%param);
|
|
1434 : my $OUT = $self->fh();
|
|
1435 : print $OUT "\nSome data...\n";
|
|
1436 : ...
|
|
1437 : }
|
|
1438 : Now $OUT holds a filhandle reference (or the string 'STDOUT')
|
|
1439 : which can be passed to other methods to display different
|
|
1440 : data for the object.
|
|
1441 : _set_display() is automatically called with $OUT as the sole
|
|
1442 : argument (after $self) by IOManager.pm::display()
|
|
1443 : if the -SHOW parameter is set to 'stats' or 'default'.
|
|
1444 :
|
|
1445 Bugs : Because the $OUT variable can be a FileHandle or a string,
|
|
1446 : it is necessary to include the line before using $OUT in
|
|
1447 : print statements:
|
|
1448 : I am considering a cleaner way of dealing with this.
|
|
1449 : Setting $OUT to a glob (*main::STDOUT) was unsuccessful.
|
|
1450 :
|
|
1451 : I'm not satisfied with the current display()/set_display() strategy.
|
|
1452
|
|
1453 See also : display() in L<Bio::Root::IOManager>
|
|
1454
|
|
1455 =cut
|
|
1456
|
|
1457 #-------------
|
|
1458 sub display {
|
|
1459 #-------------
|
|
1460 my( $self, @param ) = @_;
|
|
1461 $self->{'_io'} || $self->set_display(@param);
|
|
1462 $self->{'_io'}->display(@param);
|
|
1463 }
|
|
1464
|
|
1465
|
|
1466
|
|
1467
|
|
1468 =head2 _display_stats
|
|
1469
|
|
1470 Usage : n/a; called automatically by Bio::Root::Object::display(-SHOW=>'stats');
|
|
1471 Purpose : Display stereotypical data for an object.
|
|
1472 : Automatically called via display().
|
|
1473 Argument : Filehandle reference or string 'STDOUT' 'STDIN' 'STDERR'
|
|
1474 Status : Experimental
|
|
1475
|
|
1476 See also : L<display()|display>
|
|
1477
|
|
1478 =cut
|
|
1479
|
|
1480 #-------------------
|
|
1481 sub _display_stats {
|
|
1482 #-------------------
|
|
1483 my($self, $OUT) = @_;
|
|
1484
|
|
1485
|
|
1486 printf ( $OUT "%-15s: %s\n","NAME", $self->name());
|
|
1487 printf ( $OUT "%-15s: %s\n","MAKE", $self->make());
|
|
1488 if($self->parent) {
|
|
1489 printf ( $OUT "%-15s: %s\n","PARENT", $self->parent->to_string);
|
|
1490 }
|
|
1491 printf ( $OUT "%-15s: %d\n",'ERRORS', (defined $self->err('count') ? $self->err('count') : 0)); ###JES###
|
|
1492 printf ( $OUT "%-15s: %s\n","ERR STATE", $self->err_state());
|
|
1493 if($self->err()) {
|
|
1494 print $OUT "ERROR:\n";
|
|
1495 $self->print_err();
|
|
1496 }
|
|
1497 }
|
|
1498
|
|
1499
|
|
1500
|
|
1501 =head2 read
|
|
1502
|
|
1503 Usage : $object->read( named parameters)
|
|
1504 : See Bio::Root::IOManager::read() for a description of parameters.
|
|
1505 Purpose : Inputs data from an arbitrary source (file or STDIN).
|
|
1506 : Delegates this task to Bio::Root::IOManager::read().
|
|
1507 Status : Experimental
|
|
1508 Comments : Sets the IOManager.pm object if it is not set.
|
|
1509 : See the comments for the display() method for some comments
|
|
1510 : about IO issues for objects.
|
|
1511 : Note that the read() method uses a different strategy than
|
|
1512 : the display() method.
|
|
1513 : IO issues are considered experimental.
|
|
1514
|
|
1515 See also : L<display()|display>, read() in L<Bio::Root::IOManager>
|
|
1516
|
|
1517 =cut
|
|
1518
|
|
1519 #--------
|
|
1520 sub read {
|
|
1521 #--------
|
|
1522 my $self = shift;
|
|
1523
|
|
1524 $self->_set_io(@_) if not defined $self->{'_io'};
|
|
1525
|
|
1526 $self->{'_io'}->read(@_);
|
|
1527 }
|
|
1528
|
|
1529
|
|
1530
|
|
1531 =head2 fh
|
|
1532
|
|
1533 Usage : $object->fh(['name'])
|
|
1534 : See Bio::Root::IOManager::fh() for a complete usage description.
|
|
1535 Purpose : Get an object's current FileHandle object or IO stream indicator.
|
|
1536 : Delegates to Bio::Root::IOManager.pm.
|
|
1537 Status : Experimental
|
|
1538 Comments : Sets the IOManager.pm object if it is not set.
|
|
1539
|
|
1540 See also : fh() in L<Bio::Root::IOManager>
|
|
1541
|
|
1542 =cut
|
|
1543
|
|
1544 #--------'
|
|
1545 sub fh {
|
|
1546 #--------
|
|
1547 my $self = shift;
|
|
1548 $self->_set_io(@_) if !defined $self->{'_io'};
|
|
1549 $self->{'_io'}->fh(@_);
|
|
1550 }
|
|
1551
|
|
1552
|
|
1553 =head2 show
|
|
1554
|
|
1555 Usage : $object->show()
|
|
1556 : See Bio::Root::IOManager::show() for details.
|
|
1557 Purpose : Get the string used to specify what to display
|
|
1558 : using the display() method.
|
|
1559 : Delegates to Bio::Root::IOManager.pm.
|
|
1560 Status : Experimental
|
|
1561 Comments : Sets the IOManager.pm object if it is not set.
|
|
1562
|
|
1563 See also : show() in L<Bio::Root::IOManager>, set_display() in L<Bio::Root::IOManager>
|
|
1564
|
|
1565 =cut
|
|
1566
|
|
1567 #-----------
|
|
1568 sub show {
|
|
1569 #-----------
|
|
1570 my $self = shift;
|
|
1571 $self->_set_io(@_) if !defined $self->{'_io'};
|
|
1572 $self->{'_io'}->show;
|
|
1573 }
|
|
1574
|
|
1575
|
|
1576
|
|
1577 =head2 file
|
|
1578
|
|
1579 Usage : $object->file()
|
|
1580 : See Bio::Root::IOManager::file() for details.
|
|
1581 Purpose : Set/Get name of a file associated with an object.
|
|
1582 : Delegates to Bio::Root::IOManager.pm.
|
|
1583 Status : Experimental
|
|
1584 Comments : Sets the IOManager.pm object if it is not set.
|
|
1585
|
|
1586 See also : file() in L<Bio::Root::IOManager>
|
|
1587
|
|
1588 =cut
|
|
1589
|
|
1590 #---------
|
|
1591 sub file {
|
|
1592 #---------
|
|
1593 my $self = shift;
|
|
1594 $self->_set_io(@_) if !defined $self->{'_io'};
|
|
1595 $self->{'_io'}->file(@_);
|
|
1596 }
|
|
1597
|
|
1598
|
|
1599 =head2 compress_file
|
|
1600
|
|
1601 Usage : $object->compress_file([filename])
|
|
1602 : See Bio::Root::IOManager::compress_file() for details.
|
|
1603 Purpose : Compress a file associated with the current object.
|
|
1604 : Delegates to Bio::Root::IOManager.pm.
|
|
1605 Throws : Propagates exceptions thrown by Bio::Root::IOManager.pm
|
|
1606 Status : Experimental
|
|
1607 Comments : Sets the IOManager.pm object if it is not set.
|
|
1608
|
|
1609 See also : L<file()|file>, compress_file() in L<Bio::Root::IOManager>
|
|
1610
|
|
1611 =cut
|
|
1612
|
|
1613 #-------------------
|
|
1614 sub compress_file {
|
|
1615 #-------------------
|
|
1616 my $self = shift;
|
|
1617 $self->_set_io(@_) if !defined $self->{'_io'};
|
|
1618 $self->{'_io'}->compress_file(@_);
|
|
1619 }
|
|
1620
|
|
1621
|
|
1622
|
|
1623 =head2 uncompress_file
|
|
1624
|
|
1625 Usage : $object->uncompress_file([filename])
|
|
1626 : Delegates to Bio::Root::IOManager.pm.
|
|
1627 Purpose : Uncompress a file associated with the current object.
|
|
1628 Throws : Propagates exceptions thrown by Bio::Root::IOManager.pm
|
|
1629 Status : Experimental
|
|
1630 Comments : Sets the IOManager.pm object if it is not set.
|
|
1631
|
|
1632 See also : L<file()|file>, uncompress_file() in L<Bio::Root::IOManager>
|
|
1633
|
|
1634 =cut
|
|
1635
|
|
1636 #--------------------
|
|
1637 sub uncompress_file {
|
|
1638 #--------------------
|
|
1639 my $self = shift;
|
|
1640 $self->_set_io(@_) if !defined $self->{'_io'};
|
|
1641 $self->{'_io'}->uncompress_file(@_);
|
|
1642 }
|
|
1643
|
|
1644
|
|
1645 =head2 delete_file
|
|
1646
|
|
1647 Usage : $object->delete_file([filename])
|
|
1648 : See Bio::Root::IOManager::delete_file() for details.
|
|
1649 Purpose : Delete a file associated with the current object.
|
|
1650 : Delegates to Bio::Root::IOManager.pm.
|
|
1651 Throws : Propagates exceptions thrown by Bio::Root::IOManager.pm
|
|
1652 Status : Experimental
|
|
1653 Comments : Sets the IOManager.pm object if it is not set.
|
|
1654
|
|
1655 See also : L<file()|file>, delete_file() in L<Bio::Root::IOManager>
|
|
1656
|
|
1657 =cut
|
|
1658
|
|
1659 #-----------------
|
|
1660 sub delete_file {
|
|
1661 #-----------------
|
|
1662 my $self = shift;
|
|
1663 $self->_set_io(@_) if !defined $self->{'_io'};
|
|
1664 $self->{'_io'}->delete_file(@_);
|
|
1665 }
|
|
1666
|
|
1667
|
|
1668 =head2 file_date
|
|
1669
|
|
1670 Usage : $object->file_date( %named_parameters )
|
|
1671 : See Bio::Root::IOManager::file_date() for details.
|
|
1672 Purpose : Obtain the last modified data of a file.
|
|
1673 : Delegates to Bio::Root::IOManager.pm.
|
|
1674 Example : $object->file_date('/usr/home/me/data.txt');
|
|
1675 Throws : Propagates exceptions thrown by Bio::Root::IOManager.pm
|
|
1676 Status : Experimental
|
|
1677 Comments : Sets the IOManager.pm object if it is not set.
|
|
1678
|
|
1679 See also : L<file()|file>, file_date() in L<Bio::Root::IOManager>
|
|
1680
|
|
1681 =cut
|
|
1682
|
|
1683 #---------------
|
|
1684 sub file_date {
|
|
1685 #---------------
|
|
1686 my $self = shift;
|
|
1687 $self->_set_io(@_) if !defined $self->{'_io'};
|
|
1688 $self->{'_io'}->file_date(@_);
|
|
1689 }
|
|
1690
|
|
1691
|
|
1692
|
|
1693 =head1 EXPERIMENTAL METHODS
|
|
1694
|
|
1695
|
|
1696 =head2 xref
|
|
1697
|
|
1698 Usage : $object->xref([object | 'null']);
|
|
1699 Purpose : Sets/Gets an object(s) cross-referenced
|
|
1700 : to the current object.
|
|
1701 Example : $myObj->xref('null'); #remove all xrefs
|
|
1702 : $myObj->xref($otherObject); #add a cross referenced object
|
|
1703 Argument : Object reference or 'null' ('undef' also accepted).
|
|
1704 Returns : Object reference or undef if the object has no xref set.
|
|
1705 Throws : fatal error if argument is not an object reference or 'null'.
|
|
1706 Comments : An Xref.pm object is a vectorized wrapper for an object.
|
|
1707 : Thus, the number of objects cross-referenced can grow
|
|
1708 : and shrink at will.
|
|
1709 Status : Experimental
|
|
1710 WARNING : NOT FULLY TESTED.
|
|
1711
|
|
1712 See Also : L<Bio::Root::Xref>
|
|
1713
|
|
1714 =cut
|
|
1715
|
|
1716 #---------
|
|
1717 sub xref {
|
|
1718 #---------
|
|
1719 my $self = shift;
|
|
1720 if(@_) {
|
|
1721 my $arg = shift;
|
|
1722 if(ref $arg) {
|
|
1723 require Bio::Root::Xref;
|
|
1724
|
|
1725 if( !defined $self->{'_xref'}) {
|
|
1726 $self->{'_xref'} = new Bio::Root::Xref(-PARENT =>$self,
|
|
1727 -OBJ =>$arg);
|
|
1728 } else {
|
|
1729 $self->{'_xref'}->add($arg);
|
|
1730 }
|
|
1731 } elsif($arg =~ /null|undef/i) {
|
|
1732 undef $self->{'_xref'};
|
|
1733 } else {
|
|
1734 $self->throw("Can't set Xref using $arg: Not an object");
|
|
1735 }
|
|
1736 }
|
|
1737
|
|
1738 $self->{'_xref'};
|
|
1739 }
|
|
1740
|
|
1741
|
|
1742
|
|
1743 =head2 index
|
|
1744
|
|
1745 Purpose : To add an object to a package global hash of objects
|
|
1746 : for tracking or rapid retrieval.
|
|
1747 Usage : $self->index();
|
|
1748 Status : Experimental
|
|
1749 Comments : The object's name is used to index it into a hash. Objects in
|
|
1750 : different classes (packages) will be indexed in different hashes.
|
|
1751 : An object's name should thus be unique within its class.
|
|
1752 : To find an object, use find_object().
|
|
1753 : Uses the package global %Objects_created.
|
|
1754
|
|
1755 See also : L<find_object()|find_object>
|
|
1756
|
|
1757 =cut
|
|
1758
|
|
1759 #----------
|
|
1760 sub index {
|
|
1761 #----------
|
|
1762 my $self = shift;
|
|
1763 my $class = ref $self;
|
|
1764 my $objName = $self->{'_name'};
|
|
1765
|
|
1766 if( not defined $objName ) {
|
|
1767 $self->throw("Can't index $class object \"$objName\".");
|
|
1768 }
|
|
1769
|
|
1770 $DEBUG and do{ print STDERR "$ID: Indexing $class object \"$objName\"."; <STDIN>; };
|
|
1771
|
|
1772 $Objects_created{ $class }->{ $objName } = $self;
|
|
1773 }
|
|
1774
|
|
1775 #----------------------
|
|
1776 sub _remove_from_index {
|
|
1777 #----------------------
|
|
1778 my $self = shift;
|
|
1779 my $class = ref $self;
|
|
1780 my $objName = $self->{'_name'};
|
|
1781
|
|
1782 undef $Objects_created{$class}->{$objName} if exists $Objects_created{$class}->{$objName};
|
|
1783 }
|
|
1784
|
|
1785
|
|
1786
|
|
1787 =head2 find_object
|
|
1788
|
|
1789 Purpose : To obtain any object reference based on its unique name
|
|
1790 : within its class.
|
|
1791 Usage : $myObj = &find_object('fred');
|
|
1792 : No need to specify the class (package) name of the object.
|
|
1793 Comments : To use this method, the object must be previously
|
|
1794 : indexed by Bio::Root::Object.pm. This can be accomplished
|
|
1795 : by including 'index' in the -MAKE parameter during object
|
|
1796 : construction OR by calling the index() method on the
|
|
1797 : the object at any point after construction.
|
|
1798 : This is not an instance method.
|
|
1799 Status : Experimental
|
|
1800
|
|
1801 See also : L<index()|index>
|
|
1802
|
|
1803 =cut
|
|
1804
|
|
1805 #---------------
|
|
1806 sub find_object {
|
|
1807 #---------------
|
|
1808 my $name = shift; # Assumes name has been validated.
|
|
1809 my $class = undef;
|
|
1810 my $object = undef;
|
|
1811
|
|
1812 foreach $class ( keys %Objects_created ) {
|
|
1813 if( exists $Objects_created{ $class }->{ $name } ) {
|
|
1814 $object = $Objects_created{ $class }->{ $name };
|
|
1815 last;
|
|
1816 }
|
|
1817 }
|
|
1818 $object;
|
|
1819 }
|
|
1820
|
|
1821
|
|
1822
|
|
1823 =head2 has_warning
|
|
1824
|
|
1825 Purpose : Test whether or not an object has a non-fatal error (warning).
|
|
1826 Usage : $self->has_warning;
|
|
1827 Comments : This method is not usually needed. Checking err() is
|
|
1828 : sufficient since throw()ing an exception is a fatal event
|
|
1829 : and must be handled when it occurs.
|
|
1830 Status : Experimental
|
|
1831
|
|
1832 See also : L<err()|err>, warn() in L<Bio::Root::Root>, throw() in L<Bio::Root::Root>
|
|
1833
|
|
1834 =cut
|
|
1835
|
|
1836 #----------------
|
|
1837 sub has_warning {
|
|
1838 #----------------
|
|
1839 my $self = shift;
|
|
1840 my $errData = $self->err('type');
|
|
1841 return 1 if $errData =~ /WARNING/;
|
|
1842 0;
|
|
1843 }
|
|
1844
|
|
1845
|
|
1846
|
|
1847 =head2 print_err
|
|
1848
|
|
1849 Usage : print_err([-WHERE=>FileHandle_object [,-SHOW=>msg|note|tech|stack] or any combo])
|
|
1850 Purpose : Reports error data for any errors an object may have
|
|
1851 : as a string. This will only print warnings since exceptions
|
|
1852 : are fatal (unless a strictness of -2 is used).
|
|
1853 Example : $myObj->print_err;
|
|
1854 : $myObj->print_err(-WHERE=>$myObj->fh('err'), -SHOW=>'msgtechstack');
|
|
1855 Argument : SHOW parameter : specify a sub-set of the err data.
|
|
1856 : WHERE parameter : specify a filehandle for printing.
|
|
1857 Returns : n/a
|
|
1858 Status : Experimental
|
|
1859
|
|
1860 See also : L<err_string()|err_string>, L<strict()|strict>
|
|
1861
|
|
1862 =cut
|
|
1863
|
|
1864 #-------------
|
|
1865 sub print_err {
|
|
1866 #-------------
|
|
1867 my( $self, %param ) = @_;
|
|
1868
|
|
1869 # print "$ID: print_err()\n";
|
|
1870
|
|
1871 my $OUT = $self->set_display(%param);
|
|
1872
|
|
1873 # print "$ID: OUT = $OUT\n";
|
|
1874
|
|
1875 print $OUT $self->err_string( %param );
|
|
1876
|
|
1877 # print "$ID: done print_err()\n";
|
|
1878 }
|
|
1879
|
|
1880
|
|
1881
|
|
1882 =head2 err_string
|
|
1883
|
|
1884 Usage : err_string([-SHOW =>msg|note|tech|stack])
|
|
1885 : err_string([-SHOW =>'msgnote'] or other combos)
|
|
1886 Purpose : Reports all warnings generated by the object as a string.
|
|
1887 Example : $errData = $myObj->err_string;
|
|
1888 : print MYHANDLE $myObj->err_string();
|
|
1889 Argument : SHOW parameter : return a specific sub-set of the err data.
|
|
1890 Returns : A string containing the error data of the object.
|
|
1891 Comments : This method is provided as a safer and slightly easier to type
|
|
1892 : alternative to $self->err->string.
|
|
1893 Status : Experimental
|
|
1894
|
|
1895 See also : L<print_err()|print_err>, string() in L<Bio::Root::Err>
|
|
1896
|
|
1897 =cut
|
|
1898
|
|
1899 #----------------
|
|
1900 sub err_string {
|
|
1901 #----------------
|
|
1902 my( $self, %param ) = @_;
|
|
1903 my($out);
|
|
1904 my $errCount = $self->err('count');
|
|
1905
|
|
1906 # print "$ID: err_string(): count = $errCount\n";
|
|
1907
|
|
1908 if( $errCount) {
|
|
1909 $out = sprintf("\n%d error%s in %s \"%s\"\n",
|
|
1910 $errCount, $errCount>1?'s':'', ref($self), $self->name);
|
|
1911 $out .= $self->err->string( %param );
|
|
1912 } else {
|
|
1913 $out = sprintf("\nNo errors in %s \"%s\"\n", ref($self), $self->name);
|
|
1914 }
|
|
1915 $out;
|
|
1916 }
|
|
1917
|
|
1918
|
|
1919
|
|
1920
|
|
1921 #################################################################
|
|
1922 # DEPRECATED or HIGHLY EXPERIMENTAL METHODS
|
|
1923 #################################################################
|
|
1924
|
|
1925 =head1 HIGHLY EXPERIMENTAL/DEPRECATED METHODS
|
|
1926
|
|
1927 =head2 terse
|
|
1928
|
|
1929 Usage : $object->terse([0|1]);
|
|
1930 Purpose : Set/Get an indicator to report less than the normal amount.
|
|
1931 Argument : Boolean (0|1)
|
|
1932 Returns : Boolean (0|1)
|
|
1933 Comments : This method is for reducing the amount of reporting
|
|
1934 : an object will do.
|
|
1935 : terse can be set during object construction with the
|
|
1936 : -TERSE => 1 flag.
|
|
1937 : Not putting this method in IOManager.pm since that class
|
|
1938 : is concerned with "where" to report, not "what" or "how much".
|
|
1939 Status : Deprecated
|
|
1940 : Use verbose() with a negative value instead.
|
|
1941
|
|
1942 See also : L<verbose()|verbose>
|
|
1943
|
|
1944 =cut
|
|
1945
|
|
1946 #----------
|
|
1947 sub terse {
|
|
1948 #----------
|
|
1949 my $self = shift;
|
|
1950 if(@_) { $self->{'_verbose'} = -1 * shift; }
|
|
1951
|
|
1952 $self->warn("Deprecated method 'terse()'. Use verbose(-1) instead.");
|
|
1953
|
|
1954 my $verbosity = $self->{'_verbose'} or
|
|
1955 (ref $self->{'_parent'} and $self->{'_parent'}->verbose) or 0;
|
|
1956
|
|
1957 return $verbosity * -1;
|
|
1958 }
|
|
1959
|
|
1960
|
|
1961 #----------------------
|
|
1962 =head2 set_err_data()
|
|
1963 #----------------------
|
|
1964
|
|
1965 Usage : $object->set_err_data( field, data);
|
|
1966 Purpose : Alters data within the last error set by the object.
|
|
1967 : Interface to Bio::Root::Err::set().
|
|
1968 Returns : Calls Bio::Root::Err::set()
|
|
1969 Argument : field = string, name of Bio::Root::Err.pm data field to set.
|
|
1970 : data = string, data to set it to.
|
|
1971 Throws : Exception if object has no errors.
|
|
1972 Status : Deprecated
|
|
1973
|
|
1974 See Also : set() in L<Bio::Root::Err>
|
|
1975
|
|
1976 =cut
|
|
1977
|
|
1978 #-----------------
|
|
1979 sub set_err_data {
|
|
1980 #-----------------
|
|
1981 my( $self, $field, $data) = @_;
|
|
1982
|
|
1983 $self->throw("Object has no errors.") if !$self->{'_err'};
|
|
1984
|
|
1985 # print "$ID: set_err_data($field) with data = $data\n in object ${\$self->name}:\n", $self->err->last->string(-CURRENT=>1); <STDIN>;
|
|
1986
|
|
1987 $self->{'_err'}->last->set( $field, $data );
|
|
1988 }
|
|
1989
|
|
1990 =head2 set_read
|
|
1991
|
|
1992 Usage : see Bio::Root::IOManager::set_read()
|
|
1993 Purpose : Sets an input stream for importing data associated with an object.
|
|
1994 : Delegates to Bio::Root::IOManager::set_read().
|
|
1995 Status : Experimental
|
|
1996 WARNING! : This method has not been tested.
|
|
1997
|
|
1998 See also : set_read() in L<Bio::Root::IOManager>
|
|
1999
|
|
2000 =cut
|
|
2001
|
|
2002 #--------------
|
|
2003 sub set_read {
|
|
2004 #--------------
|
|
2005 my($self,%param) = @_;
|
|
2006
|
|
2007 $self->_set_io(%param) if !defined $self->{'_io'};
|
|
2008
|
|
2009 $self->{'_io'}->set_read(%param);
|
|
2010 }
|
|
2011
|
|
2012
|
|
2013
|
|
2014 =head2 set_log_err
|
|
2015
|
|
2016 Usage : see Bio::Root::IOManager::set_log_err()
|
|
2017 Purpose : Sets the output stream for logging information about
|
|
2018 : an object's errors.
|
|
2019 : Delegates to Bio::Root::IOManager::set_log_err().
|
|
2020 Status : Experimental
|
|
2021 WARNING! : This method has not been tested.
|
|
2022
|
|
2023 See also : set_log_err() in L<Bio::Root::IOManager>
|
|
2024
|
|
2025 =cut
|
|
2026
|
|
2027 #---------------'
|
|
2028 sub set_log_err {
|
|
2029 #---------------
|
|
2030 my($self,%param) = @_;
|
|
2031
|
|
2032 $self->_set_io(%param) if !defined $self->{'_io'};
|
|
2033
|
|
2034 $self->{'_io'}->set_log_err(%param);
|
|
2035 }
|
|
2036
|
|
2037
|
|
2038 1;
|
|
2039 __END__
|
|
2040
|
|
2041
|
|
2042 #####################################################################################
|
|
2043 # END OF CLASS #
|
|
2044 #####################################################################################
|
|
2045
|
|
2046 =head1 FOR DEVELOPERS ONLY
|
|
2047
|
|
2048 =head2 Data Members
|
|
2049
|
|
2050 Information about the various data members of this module is provided for those
|
|
2051 wishing to modify or understand the code. Two things to bear in mind:
|
|
2052
|
|
2053 =over 4
|
|
2054
|
|
2055 =item 1 Do NOT rely on these in any code outside of this module.
|
|
2056
|
|
2057 All data members are prefixed with an underscore to signify that they are private.
|
|
2058 Always use accessor methods. If the accessor doesn't exist or is inadequate,
|
|
2059 create or modify an accessor (and let me know, too!).
|
|
2060
|
|
2061 =item 2 This documentation may be incomplete and out of date.
|
|
2062
|
|
2063 It is easy for this documentation to become obsolete as this module is still evolving.
|
|
2064 Always double check this info and search for members not described here.
|
|
2065
|
|
2066 =back
|
|
2067
|
|
2068 An instance of Bio::Root::Object.pm is a blessed reference to a hash containing
|
|
2069 all or some of the following fields:
|
|
2070
|
|
2071 FIELD VALUE
|
|
2072 ------------------------------------------------------------------------
|
|
2073 _name Common name for an object useful for indexing.
|
|
2074 Should be unique within its class.
|
|
2075
|
|
2076 _parent The object which created and is responsible for this object.
|
|
2077 When a parent is destroyed, it takes all of its children with it.
|
|
2078
|
|
2079 _err Bio::Root::Err.pm object reference. Undefined if the object has no error
|
|
2080 or if the _record_err member is false (which is the default).
|
|
2081 If object has multiple errors, err becomes a linked
|
|
2082 list of Err objects and the err member always points to latest err.
|
|
2083 In theory, an object should care only about whether or not it HAS
|
|
2084 an Err not how many it has. I've tried to make the management of
|
|
2085 multiple errors as opaque as possible to Bio::Root::Object.
|
|
2086
|
|
2087 _errState One of @Bio::Root::Err::ERR_TYPES. Allows an object to quickly determine the
|
|
2088 the type of error it has (if any) without having to examine
|
|
2089 potentially multiple Err object(s).
|
|
2090
|
|
2091 _xref Bio::Root::Xref object (Vector) for tracking other object(s) related to the
|
|
2092 present object not by inheritance or composition but by some arbitrary
|
|
2093 criteria. This is a new, experimental feature and is not fully implemented.
|
|
2094
|
|
2095 _make Used as a switch for custom object initialization. Provides a
|
|
2096 mechanism for alternate constructors. This is somewhat experimental.
|
|
2097 It may be useful for contruction of complex objects and may be of
|
|
2098 use for determining how an object was constructed post facto.
|
|
2099
|
|
2100 _io Bio::Root::IOManager.pm object reference. Used primarily for handling the
|
|
2101 display of an object's data.
|
|
2102
|
|
2103 _strict Integer flag to set the sensitivity to exceptions/warnings
|
|
2104 for a given object.
|
|
2105
|
|
2106 _verbose Boolean indicator for reporting more or less than the normal amount.
|
|
2107
|
|
2108 _record_err Boolean indicator for attaching all thrown exception objects
|
|
2109 to the current object. Default = false (don't attach exceptions).
|
|
2110
|
|
2111 =cut
|
|
2112
|
|
2113
|
|
2114 MODIFICATION NOTES:
|
|
2115 -----------------------
|
|
2116 0.041, sac --- Thu Feb 4 03:50:58 1999
|
|
2117 * warn() utilizes the Global $CGI indicator to supress output
|
|
2118 when script is running as a CGI.
|
|
2119
|
|
2120 0.04, sac --- Tue Dec 1 04:32:01 1998
|
|
2121 * Incorporated the new globals $STRICTNESS and $VERBOSITY
|
|
2122 and eliminated WARN_ON_FATAL, FATAL_ON_WARN and DONT_WARN.
|
|
2123 * Deprecated terse() since it is better to think of terseness
|
|
2124 as negative verbosity.
|
|
2125 * Removed autoloading-related code and comments.
|
|
2126
|
|
2127 0.035, 28 Sep 1998, sac:
|
|
2128 * Added _drop_child() method to attempt to break cyclical refs
|
|
2129 between parent and child objects.
|
|
2130 * Added to_string() method.
|
|
2131 * Err objects no longer know their parents (no need).
|
|
2132
|
|
2133 0.031, 2 Sep 1998, sac:
|
|
2134 * Documentation changes only. Wrapped the data member docs
|
|
2135 at the bottom in POD comments which fixes compilation bug
|
|
2136 caused by commenting out __END__.
|
|
2137
|
|
2138 0.03, 16 Aug 1998, sac:
|
|
2139 * Calls to warn() or throw() now no longer result in Err.pm objects
|
|
2140 being attached to the current object. For discussion about this
|
|
2141 descision, see comments under err().
|
|
2142 * Added the -RECORD_ERR constructor option and Global::record_err()
|
|
2143 method to enable the attachment of Err.pm object to the current
|
|
2144 object.
|
|
2145 * Minor bug fixes with parameter handling (%param -> @param).
|
|
2146 * Added note about AUTOLOADing.
|
|
2147
|
|
2148 0.023, 20 Jul 1998, sac:
|
|
2149 * Changes in Bio::Root::IOManager::read().
|
|
2150 * Improved memory management (destroy(), DESTROY(), and changes
|
|
2151 in Bio::Root::Vector.pm).
|
|
2152
|
|
2153 0.022, 16 Jun 1998, sac:
|
|
2154 * Changes in Bio::Root::IOManager::read().
|
|
2155
|
|
2156 0.021, May 1998, sac:
|
|
2157 * Touched up _set_clone().
|
|
2158 * Refined documentation in this and other Bio::Root modules
|
|
2159 (converted to use pod2html in Perl 5.004)
|
|
2160
|
|
2161
|