annotate variant_effect_predictor/Bio/Root/Vector.pm @ 0:21066c0abaf5 draft

Uploaded
author willmclaren
date Fri, 03 Aug 2012 10:04:48 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1 #-----------------------------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2 # PACKAGE : Bio::Root::Vector.pm
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 # AUTHOR : Steve Chervitz (sac@bioperl.org)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4 # CREATED : 15 April 1997
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5 # REVISION: $Id: Vector.pm,v 1.10 2002/10/22 07:38:37 lapp Exp $
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 # STATUS : Alpha
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8 # WARNING: This is considered an experimental module.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10 # For documentation, run this module through pod2html
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 # (preferably from Perl v5.004 or better).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 # MODIFIED:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14 # sac --- Fri Nov 6 14:24:48 1998
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15 # * Added destroy() method (experimental).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16 # 0.023, 20 Jul 1998, sac:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 # * Improved memory management (_destroy_master()).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 # Copyright (c) 1997 Steve Chervitz. All Rights Reserved.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20 # This module is free software; you can redistribute it and/or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 # modify it under the same terms as Perl itself.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22 #-----------------------------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24 package Bio::Root::Vector;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 use Bio::Root::Global qw(:devel);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 use Bio::Root::Object ();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 # @ISA = qw(Bio::Root::Object); # Eventually perhaps...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 use vars qw($ID $VERSION);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 $ID = 'Bio::Root::Vector';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 $VERSION = 0.04;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 my @SORT_BY = ('rank','name');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38 ## POD Documentation:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42 Bio::Root::Vector - Interface for managing linked lists of Perl5 objects.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 =head2 Object Creation
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 B<At present, Vector objects cannot be instantiated.> This
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 package is currently designed to be inherited along with another class
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 that provides a constructor (e.g., B<Bio::Root::Object.pm>).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51 The Vector provides a set of methods that can then be used for managing
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 sets of objects.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 See L<the USAGE section | USAGE>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 =head1 INSTALLATION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 This module is included with the central Bioperl distribution:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 http://bio.perl.org/Core/Latest
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 ftp://bio.perl.org/pub/DIST
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 Follow the installation instructions included in the README file.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68 Bio::Root::Vector.pm provides an interface for creating and manipulating
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 dynamic sets (linked lists) of Perl5 objects. This is an abstract class (ie.,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70 there is no constructor) and as such is expected to be inherited along with
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 some other class (see note above).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 Vectors are handy when, for example, an object may contain one or more
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 other objects of a certain class. The container object knows only
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 that is has at least one such object; the multiplex nature of the contained
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76 object is managed by the contained object via its Vector interface.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 The methods for adding, removing, counting, listing, and sorting all objects
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 are bundled together in Vector.pm.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80 Thus, the current Bio::Root::Vector class is somewhat of a cross between an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 interator and a composite design pattern. At present, a number of classes
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82 utilize Bio::Root::Vector's composite-like behavior to implement a composite
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 pattern (Bio::SeqManager.pm, for example).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 This is not necessarily ideal and is expected to change.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 =head1 USAGE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 For a usage demo of Bio::Root::Vector.pm see the scripts in the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 examples/root_object/vector directory.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 =head1 DEPENDENCIES
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 Bio::Root::Vector.pm does not directly inherit from B<Bio::Root::Object.pm> but
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 creates an manager object which does.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 =head1 BUGS/FEATURES
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 By default, all Vectors are doubly-linked lists. This relieves one from
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 the burden of worrying about whether a given Vector is single- or doubly-linked.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 However, when generating lots of Vectors or extremely large vectors, memory
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 becomes an issue. In particular, signaling the GC to free the memory for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 an object when you want to remove it. B<Until this memory issue is resolved,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 the use of Vector.pm is not recommended for large projects.>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 Although it is not required, all objects within a vector are expected
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 to derive from the same class (package). Support for heterogeneous
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 Vectors has not been explicitly added (but they should work fine, as long
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 as you know what you're doing).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 =head1 FEEDBACK
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 =head2 Mailing Lists
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 User feedback is an integral part of the evolution of this and other Bioperl modules.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 Send your comments and suggestions preferably to one of the Bioperl mailing lists.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 Your participation is much appreciated.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 bioperl-l@bioperl.org - General discussion
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 http://bioperl.org/MailList.shtml - About the mailing lists
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 =head2 Reporting Bugs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 Report bugs to the Bioperl bug tracking system to help us keep track the bugs and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 their resolution. Bug reports can be submitted via email or the web:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 bioperl-bugs@bio.perl.org
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 http://bugzilla.bioperl.org/
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 =head1 AUTHOR
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 Steve Chervitz E<lt>sac@bioperl.orgE<gt>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 See L<the FEEDBACK section | FEEDBACK> for where to send bug reports and comments.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 =head1 VERSION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138 Bio::Root::Vector.pm, 0.04
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 =head1 TODO
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 =over 4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 =item * (Maybe) create an container class version of this module
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 to permit Vectors to be instantiated. Thus, instead of inherited
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 from both Object.pm and Vector.pm, you could create a Vector.pm object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 =item * Improve documentation.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 =back
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153 =head1 SEE ALSO
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 Bio::Root::Object.pm - Core object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 Bio::Root::Err.pm - Error/Exception object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 Bio::Root::Global.pm - Manages global variables/constants
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 http://bio.perl.org/Projects/modules.html - Online module documentation
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 http://bio.perl.org/ - Bioperl Project Homepage
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 =head1 ACKNOWLEDGEMENTS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 This module was developed under the auspices of the Saccharomyces Genome
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165 Database:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 http://genome-www.stanford.edu/Saccharomyces
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 =head1 COPYRIGHT
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 Copyright (c) 1996-98 Steve Chervitz. All Rights Reserved.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 This module is free software; you can redistribute it and/or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 modify it under the same terms as Perl itself.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 #'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 ##
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 ###
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 #### END of main POD documentation.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 ###
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 ##
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 =head1 APPENDIX
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 Methods beginning with a leading underscore are considered private
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 and are intended for internal use by this module. They are
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 B<not> considered part of the public interface and are described here
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 for documentation purposes only.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 ########################################################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 # CONSTRUCTOR #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 ########################################################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 ## No constructor. See _set_master() for construction of {Master} data member.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 ## Destructor: Use remove_all() or remove().
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 # New Idea for destructor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 #-------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 sub destroy {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 #-------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 local($^W) = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 undef $self->{'_prev'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 undef $self->{'_next'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 undef $self->{'_rank'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211 undef $self->{'_master'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 #####################################################################################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 ## ACCESSORS ##
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 #####################################################################################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 =head2 set_rank
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 Purpose : To set an object's rank to an arbitrary numeric
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 : value to be used for sorting the objects of the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 Usage : $self->set_rank(-RANK =>numeric_ranking_data,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 : -RANK_BY =>ranking_criterion_string);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225 : or without the named parameters as (rank, rank_by).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 Throws : warning (if rank is set without also setting RANK_BY)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227 Comments : It is redundant for every object to store RANK_BY data.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 : For this reason, the RANK_BY data is stored with the master
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 : object associated with the vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 See Also : L<rank>(), L<rank_by>()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 #-------------'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 sub set_rank {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 #-------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 my( $self, %param) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 $self->_set_master($self) unless $self->{'_master'}->{'_set'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 my($rank, $rank_by) = $self->master->_rearrange([qw(RANK RANK_BY)], %param);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244 $DEBUG==1 and do{ print STDERR "$ID:set_rank() = $rank; Criteria: $rank_by."; <STDIN>; };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 $self->{'_rank'} = ($rank || undef);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 $self->{'_master'}->{'_rankBy'} = ($rank_by || undef);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 if( defined $self->{'_rank'} and not defined $self->{'_master'}->{'_rankBy'} ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 return $self->master->warn('Rank defined without ranking criteria.');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 sub _set_rank_by {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 my( $self, $arg) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256 $self->{'_master'}->{'_rankBy'} = $arg || 'unknown';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259 sub _set_master {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 ## A vector does not need a master object unless it needs to grow.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 my($self,$obj) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 # print "$ID: _set_master() new Master object for ${\$obj->name}."; <STDIN>;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265 require Bio::Root::Object;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266 my $master = {};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 bless $master, 'Bio::Root::Object';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 $master->{'_set'} = 1; ## Special member indicating that this method has been called.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 ## Necessary since perl will generate an anonymous {Master}
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 ## hash ref on the fly. This ref will not be blessed however.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 $master->{'_first'} = $obj;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273 $master->{'_last'} = $obj;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274 $master->{'_size'} = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275 $master->{'_index'}->{$obj->name()} = $obj;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 $self->{'_master'} = $master;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278 $self->{'_rank'} = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 $self->{'_prev'} = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 $self->{'_next'} = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281 # $self->{'_master'}->{'_rankBy'} = undef; # Default rank is the order of addition to Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284 sub _destroy_master {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 # This is called when the last object in the vector is being remove()d
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288 return if !$self->master or !$self->master->{'_set'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 my $master = $self->master;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292 ## Get rid of the Vector master object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 ref $master->{'_first'} and (%{$master->{'_first'}} = (), undef $master->{'_first'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 ref $master->{'_last'} and (%{$master->{'_last'}} = (), undef $master->{'_last'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295 ref $master->{'_index'} and (%{$master->{'_index'}} = (), undef $master->{'_index'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 %{$master} = ();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297 undef $master;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 =head2 clone_vector
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303 Purpose : Call this method to clone the whole vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 : NOT calling this method will extract the vector element.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 Usage : $self->clone_vector();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306 Throws : Exception if argument is not an object reference.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 Comments : This method is usually called from within a module's
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 : _set_clone() method for modules that inherit from
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 : Bio::Root::Vector.pm.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313 #-----------------'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314 sub clone_vector {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315 #-----------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316 my($self, $obj) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318 ref($obj) || throw($self, "Can't clone $ID object: Not an object ref ($obj)");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 $self->{'_prev'} = $obj->{'_prev'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 $self->{'_next'} = $obj->{'_next'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 $self->{'_rank'} = $obj->{'_rank'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 $self->{'_master'} = $obj->{'_master'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 =head2 prev
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 Purpose : Returns the previous object in the Vector or undef
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 : if on first object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331 Usage : $self->prev
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 #--------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 sub prev { my $self = shift; $self->{'_prev'}; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337 #--------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341 =head2 next
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 Purpose : Returns the next object in the Vector or undef
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 : if on last object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 Usage : $self->next
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349 #--------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350 sub next { my $self = shift; $self->{'_next'}; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351 #--------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 =head2 first
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 Purpose : Returns the first object in the Vector or $self
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358 : if Vector size = 1.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359 Usage : $self->first
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363 #----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 sub first {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365 #----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367 defined $self->{'_master'} ? $self->{'_master'}->{'_first'} : $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371 =head2 last
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373 Purpose : Returns the last object in the Vector or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374 : $self if Vector size = 1.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 Usage : $self->last
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379 #-------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380 sub last {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 #-------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 defined $self->{'_master'} ? $self->{'_master'}->{'_last'} : $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388 =head2 rank
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 Purpose : Returns the rank of the current object or 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 : if rank is not defined.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392 Usage : $self->rank
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 See Also : L<set_rank>()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 #---------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 sub rank { my $self = shift; $self->{'_rank'} || 1; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400 #---------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404 =head2 rank_by
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406 Purpose : Returns the ranking criterion or the string 'order of addition'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 : if rankBy has not been explicitly set.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 Usage : $self->rank_by
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 See Also : L<set_rank>()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414 #-----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 sub rank_by {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416 #-----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 defined $self->{'_master'} ? ($self->{'_master'}->{'_rankBy'}||'order of addition')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419 : 'unranked';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 }
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 =head2 size
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426 Purpose : Returns the number of objects currently in the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427 Usage : $self->size
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431 #---------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432 sub size {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433 #---------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435 defined $self->{'_master'} ? $self->{'_master'}->{'_size'} : 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
437
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
438
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
439 =head2 master
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
440
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441 Purpose : Returns the master object associated with the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442 : (should probably be a private method).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443 Usage : $self->master
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447 #-----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448 sub master { my $self = shift; $self->{'_master'}; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
449 #-----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
450
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
451
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
452 ## Not sure what these potentially dangerous methods are used for.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
453 ## Should be unnecessary and probably can be removed.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
454 sub set_prev { my($self,$obj) = @_; $self->{'_prev'} = $obj; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
455 sub set_next { my($self,$obj) = @_; $self->{'_next'} = $obj; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
456
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
457 #############################################################################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
458 # INSTANCE METHODS ##
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
459 #############################################################################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
460
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
461
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
462 =head2 is_first
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
463
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
464 Purpose : Test whether the current object is the first in the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
465 Usage : $self->is_first
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
466
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
467 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
468
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
469 #------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
470 sub is_first { my($self) = shift; return not defined $self->{'_prev'}; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
471 #------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
472
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
473
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
474 =head2 is_last
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
475
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
476 Purpose : Test whether the current object is the last in the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
477 Usage : $self->is_last
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
478
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
479 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
480
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
481 #------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
482 sub is_last { my($self) = shift; return not defined $self->{'_next'}; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
483 #------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
484
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
485
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
486
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
487
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
488 =head2 get
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
489
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
490 Purpose : Retrives an object from the Vector given its name.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
491 : Returns undef if the object cannot be found.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
492 Usage : $self->get(object_name)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
493 Examples : $self->get($obj->name)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
494
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
495 See Also : L<list>()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
496
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
497 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
498
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
499 #--------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
500 sub get {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
501 #--------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
502 my($self,$name) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
503
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
504 my ($obj);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
505 # print "$ID get(): getting $name\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
506
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
507 if($self->{'_master'}->{'_set'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
508 # my @names = keys %{$self->{'_master'}->{'_index'}};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
509 # print "$ID: names in hash:\n@names";<STDIN>;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
510 # print " returning $self->{'_master'}->{'_index'}->{$name}\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
511 local($^W) = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
512 $obj = $self->{'_master'}->{'_index'}->{$name};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
513 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
514
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
515 elsif($self->name =~ /$name/i) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
516 # print " returning self\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
517 $obj = $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
518 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
519
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
520 if(not ref $obj) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
521 $self->throw("Can't get object named \"$name\": object not set or name undefined.");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
522 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
523 $obj;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
524 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
525
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
526 ## Former strategy: hunt through the list for the object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
527 ## No longer needed since master indexes all objects.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
528 # do{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
529 # if($obj->name eq $name) { return $obj; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
530 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
531 # } while($obj = $current->prev());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
532
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
533
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
534
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
535
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
536 =head2 add
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
537
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
538 Purpose : Add an object to the end of a Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
539 Usage : $self->add(object_reference)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
540
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
541 See also : L<insert>(), L<remove>()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
542
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
543 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
544
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
545 #--------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
546 sub add {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
547 #--------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
548 my($self,$new,$index) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
549
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
550 $self->_set_master($self) unless $self->{'_master'}->{'_set'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
551
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
552 # print "\n\nADDING TO VECTOR ${\ref $self} ${\$self->name}\nFOR PARENT: ${\ref $self->parent} ${\$self->parent->name}\n\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
553
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
554 $self->{'_next'} = $new;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
555 $new->{'_prev'} = $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
556 $self->{'_master'}->{'_last'} = $new;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
557 $self->{'_master'}->{'_size'}++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
558 $new->{'_master'} = $self->{'_master'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
559 $new->_incrementRank();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
560 $new->Bio::Root::Vector::_index();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
561
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
562 # printf "NEW CONTENTS: (n=%s)\n", $self->size;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
563 # my $obj = $self->first;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
564 # my $count=0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
565 # do { print "\n","Object #",++$count,"\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
566 # $obj->display;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
567 # } while($obj=$obj->next);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
568 # <STDIN>;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
569 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
570
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
571
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
572 sub _index {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
573 my($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
574 my $name = $self->name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
575
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
576 # Generate unique name, if necessary, for indexing purposes.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
577 if( not $name or $name =~ /anonymous/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
578 $name ||= '';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
579 $name .= $self->size();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
580 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
581 # print "$ID: _index() called for $name\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
582
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
583 $self->{'_master'}->{'_index'}->{$name} = $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
584 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
585
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
586 sub _incrementRank {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
587 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
588 return if not defined $self->{'_prev'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
589 $self->{'_rank'} = $self->{'_prev'}->rank() + 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
590 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
591
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
592
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
593 =head2 remove
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
594
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
595 Purpose : Remove the current object from the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
596 Usage : $self->remove([-RET=>'first'|'last'|'next'|'prev'], [-UPDATE => 0|1])
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
597 Returns : The first, last, next, or previous object in the Vector
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
598 : depending on the value of the -RET parameter.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
599 : Default = next.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
600 Argument : Named parameters: (TAGS CAN BE ALL UPPER OR ALL LOWER CASE)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
601 : -RET => string: 'first', 'last', 'prev' 'next'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
602 : THis indicates the object to be returned.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
603 : -UPDATE => boolean, if non-zero all objects in the vector
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
604 : will be re-ranked.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
605 Comments : The -UPDATE parameter should be set to true to force a re-updating
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
606 : of the rank data for each object. (default = 0, no update).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
607
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
608 See Also : L<add>(), L<insert>(), L<shift>(), L<chop>()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
609
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
610 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
611
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
612 #-----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
613 sub remove {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
614 #-----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
615 my($self,%param) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
616 my $updateRank = $param{-UPDATE} || $param{'-update'} || 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
617 my $ret = $param{-RET} || $param{'-ret'} || 'next';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
618
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
619 $DEBUG==2 && do{ print STDERR "$ID: removing ${\$self->name}; ret = $ret";<STDIN>; };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
620
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
621 ## This set of conditionals involves primarily pointer shuffling.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
622 ## The special case of destroying a vector of size 1 is handled.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
623
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
624 if($self->is_first()) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
625 $DEBUG==2 && print STDERR "---> removing first object: ${\$self->name()}.\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
626 if($self->is_last) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
627 # print "Removing only object in vector: ${\$self->name}.\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
628 $self->_destroy_master();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
629 return $self->destroy;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
630 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
631 undef ($self->{'_next'}->{'_prev'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
632 $self->_update_first($self->{'_next'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
633 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
634
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
635 } elsif($self->is_last()) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
636 $DEBUG==2 && print STDERR "---> removing last object: ${\$self->name()}.\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
637 undef ($self->{'_prev'}->{'_next'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
638 $self->_update_last($self->{'_prev'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
639
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
640 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
641 $DEBUG==2 && print STDERR "---> removing internal object.\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
642 $self->{'_prev'}->{'_next'} = $self->{'_next'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
643 $self->{'_next'}->{'_prev'} = $self->{'_prev'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
644 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
645
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
646 $updateRank && $self->_update_rank();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
647 $self->{'_master'}->{'_size'}--;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
648
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
649 # print "new vector size = ",$self->size,"\n"; <STDIN>;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
650
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
651 my($retObj);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
652
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
653 if( $self->size) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
654 if($ret eq 'first') { $retObj = $self->first(); }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
655 elsif($ret eq 'last') { $retObj = $self->last(); }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
656 elsif($ret eq 'next') { $retObj = $self->next(); }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
657 elsif($ret eq 'prev') { $retObj = $self->prev(); }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
658 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
659
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
660 ## Destroy the object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
661 # $self->destroy;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
662
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
663 $DEBUG && do{ print STDERR "$ID: returning ${\$retObj->name}";<STDIN>; };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
664
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
665 $retObj;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
666 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
667
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
668 sub _update_first {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
669 my($self,$first) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
670 $DEBUG && print STDERR "Updating first.\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
671 undef ($first->{'_prev'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
672 $self->{'_master'}->{'_first'} = $first;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
673 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
674
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
675 sub _update_last {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
676 my($self,$last) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
677 $DEBUG && print STDERR "Updating last.\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
678 undef ($last->{'_next'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
679 $self->{'_master'}->{'_last'} = $last;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
680 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
681
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
682
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
683 =head2 remove_all
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
684
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
685 Purpose : Remove all objects currently in the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
686 Usage : $self->remove_all
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
687
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
688 See Also : L<remove>(), L<shift>(), L<chop>()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
689
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
690 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
691
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
692 #---------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
693 sub remove_all {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
694 #---------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
695 my($self,%param) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
696
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
697 $DEBUG==2 && print STDERR "DESTROYING VECTOR $self ${\$self->name}";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
698
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
699 # print "$ID Removing all.";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
700
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
701 $self = $self->first();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
702
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
703 while(ref $self) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
704 # print "$ID: removing ${\$self->name}\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
705 $self = $self->remove(-RET=>'next');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
706 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
707 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
708
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
709
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
710 =head2 shift
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
711
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
712 Purpose : Remove the first object from the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
713 : This is a wrapper for remove().
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
714 Usage : $self->shift([-RET=>'first'|'last'|'next'|'prev'])
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
715 Returns : The object returned by remove().
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
716
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
717 See Also : L<remove>(), L<chop>()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
718
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
719 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
720
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
721 #---------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
722 sub shift {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
723 #---------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
724 my($self,%param) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
725 $self = $self->first();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
726 $self = $self->remove(%param);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
727 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
728
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
729
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
730 =head2 chop
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
731
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
732 Purpose : Remove the last object from the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
733 : This is a wrapper for remove().
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
734 Usage : $self->chop([-RET=>'first'|'last'|'next'|'prev'])
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
735 Returns : The object returned by remove().
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
736
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
737 See Also : L<remove>(), L<shift>()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
738
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
739 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
740
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
741 #----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
742 sub chop {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
743 #----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
744 my($self,%param) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
745 $self = $self->last();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
746 $self = $self->remove(%param);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
747 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
748
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
749
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
750
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
751 =head2 insert
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
752
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
753 Purpose : Insert a new object into the vector relative to the current object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
754 Usage : $self->insert(object_ref, ['before'|'after'])
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
755 Examples : $self->insert($obj) # Default insert after $self
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
756 : $self->insert($obj,'before')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
757 Returns : The new number of objects in the vector (int).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
758 Throws : exception if the first argument is not a reference.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
759
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
760 See Also : L<add>(), L<remove>()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
761
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
762 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
763
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
764 #-----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
765 sub insert {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
766 #-----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
767 my($self,$object,$where) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
768 my($first);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
769 $where ||= 'after';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
770
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
771 $self->_set_master($self) unless $self->{'_master'}->{'_set'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
772
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
773 ref($object) || return $self->master->throw("Can't insert. Not an object: $object");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
774
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
775 if($where eq 'before') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
776 $object->{'_next'} = $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
777 $object->{'_prev'} = $self->{'_prev'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
778 $object->{'_master'} = $self->{'_master'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
779 $self->{'_prev'}->{'_next'} = $object;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
780 $self->{'_prev'} = $object;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
781 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
782 $object->{'_prev'} = $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
783 $object->{'_next'} = $self->{'_next'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
784 $object->{'_master'} = $self->{'_master'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
785 $self->{'_next'}->{'_prev'} = $object;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
786 $self->{'_next'} = $object;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
787 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
788 $self->{'_master'}->{'_size'}++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
789 $object->Bio::Root::Vector::_index(); ##Fully qualified to disambiguate a potentially common method name.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
790 $self->_update_rank();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
791 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
792
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
793 sub _update_rank {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
794 my($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
795 my $current = $self->first();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
796 my $count = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
797 $DEBUG && print STDERR "$ID: Updating rank.\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
798 do{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
799 $count++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
800 $current->{'_rank'} = $count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
801
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
802 } while($current = $current->next());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
803 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
804
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
805
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
806 =head2 list
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
807
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
808 Purpose : Returns objects in the Vector as an array or array slice.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
809 Usage : $self->list([starting_object|'first'] [,ending_object|'last'])
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
810 Examples : $self->list
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
811 : $self->list('first',$self->prev)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
812
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
813 See Also : L<get>()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
814
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
815 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
816
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
817 #----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
818 sub list {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
819 #----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
820 my($self,$start,$stop) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
821 my(@list);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
822
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
823 $start ||= 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
824 $stop ||= 'last';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
825
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
826 if( $start =~ /first|beg|start/i or $start <= 1 ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
827 $start = $self->first();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
828 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
829
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
830 if( $stop =~ /last|end|stop/i ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
831 $stop = $self->last();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
832 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
833
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
834 ref($start) || ($start = $self->first());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
835 ref($stop) || ($stop = $self->last());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
836
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
837 my $obj = $start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
838 my $fini = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
839 do{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
840 push @list, $obj;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
841 if($obj eq $stop) { $fini = 1; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
842 } while( $obj = $obj->next() and !$fini);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
843
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
844 @list;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
845 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
846
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
847
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
848 =head2 sort
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
849
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
850 Purpose : Sort the objects in the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
851 Usage : $self->sort(['rank'|'name'], [reverse])
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
852 Returns : The last object of the sorted Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
853 Argument : First argument can be 'name' or 'rank' to sort on
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
854 : the object's name or rank data member, respectively.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
855 : If reverse is non-zero, sort will be in reverse order.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
856 Example : $self->sort() # Default sort by rank, not reverse.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
857 : $self->sort('name','reverse')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
858
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
859 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
860
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
861 #---------'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
862 sub sort {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
863 #---------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
864 my ($self,$sortBy,$reverse) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
865 my (@unsortedList,@sortedList);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
866
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
867 $sortBy ||= 'rank';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
868 my $rankBy = $self->rank_by;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
869
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
870 ### Build the initial unsorted list.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
871 my $obj = $self->first();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
872 do{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
873 push @unsortedList, $obj;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
874 } while( $obj = $obj->next());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
875
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
876 # print "UNSORTED LIST:\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
877 # foreach(@unsortedList) {print $_->name().' '};<STDIN>;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
878
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
879 ### Sort it.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
880 if( $sortBy =~ /rank/i) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
881 # print "sorting by rank";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
882 if($reverse) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
883 # print " (reverse).\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
884 @sortedList = reverse sort _sort_by_rank @unsortedList;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
885 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
886 @sortedList = sort _sort_by_rank @unsortedList;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
887 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
888 } elsif( $sortBy =~ /name/i) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
889 # print "sorting by name";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
890 if($reverse) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
891 # print "(reverse).\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
892 @sortedList = reverse sort _sort_by_name @unsortedList;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
893 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
894 @sortedList = sort _sort_by_name @unsortedList;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
895 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
896 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
897 # print "unknown sort criteria: $sortBy\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
898 $self->warn("Invalid sorting criteria: $sortBy.",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
899 "Sorting by rank.");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
900 @sortedList = sort _sort_by_rank @unsortedList;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
901 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
902
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
903
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
904 # if($reverse) { @sortedList = reverse sort @sortedList; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
905
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
906 # print "SORTED LIST:\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
907 # foreach(@sortedList) {print $_->name().' '};<STDIN>;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
908
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
909 ### Re-load the Vector with the sorted list.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
910 my $count=0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
911
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
912 $self = $sortedList[0];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
913 $self->_set_master($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
914 $self->_set_rank_by($rankBy);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
915
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
916 my($i);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
917 my $current = $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
918 for($i=1; $i<@sortedList; $current=$sortedList[$i], $i++) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
919 $current->add($sortedList[$i]);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
920 if($i==$#sortedList) { $sortedList[$i]->{'_next'} = undef;}
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
921 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
922
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
923 $self->last();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
924 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
925
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
926 sub _sort_by_rank { my $aRank = $a->rank(); my $bRank = $b->rank(); $aRank <=> $bRank; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
927
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
928 sub _sort_by_name { my $aName = $a->name(); my $bName = $b->name(); $aName cmp $bName; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
929
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
930
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
931
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
932 =head2 valid_any
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
933
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
934 Purpose : Determine if at least one object in the Vector is valid.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
935 Usage : $self->valid_any
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
936 Status : Deprecated.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
937 Comments : A non-valid object should throw an exception that must be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
938 : be caught an dealt with on the spot.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
939
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
940 See Also : B<Bio::Root::Object::valid()>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
941
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
942 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
943
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
944 #-------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
945 sub valid_any {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
946 #-------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
947 my $self = &shift(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
948
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
949 my $obj = $self->first();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
950 do{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
951 return 1 if $obj->valid();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
952 } while( $obj = $obj->next());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
953
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
954 return undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
955 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
956
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
957
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
958 =head2 valid_all
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
959
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
960 Purpose : Determine if all objects in the Vector are valid.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
961 Usage : $self->valid_all
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
962 Comments : A non-valid object should throw an exception that must be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
963 : be caught an dealt with on the spot.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
964
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
965 See Also : B<Bio::Root::Object::valid()>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
966
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
967 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
968
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
969 #--------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
970 sub valid_all {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
971 #--------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
972 my $self = &shift(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
973
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
974 my $obj = $self->first();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
975 do{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
976 return unless $obj->valid();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
977 } while( $obj = $obj->next());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
978
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
979 return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
980 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
981
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
982 sub _display_stats {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
983 # This could be fleshed out a bit...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
984
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
985 my( $self, $OUT ) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
986
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
987 printf ( $OUT "%-11s %s\n","RANK:", $self->rank());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
988 printf ( $OUT "%-11s %s\n","RANK BY:", $self->rank_by());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
989 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
990
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
991 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
992 __END__
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
993
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
994 #####################################################################################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
995 # END OF CLASS #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
996 #####################################################################################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
997
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
998 =head1 FOR DEVELOPERS ONLY
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
999
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1000 =head2 Data Members
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1001
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1002 Information about the various data members of this module is provided for those
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1003 wishing to modify or understand the code. Two things to bear in mind:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1004
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1005 =over 4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1006
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1007 =item 1 Do NOT rely on these in any code outside of this module.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1008
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1009 All data members are prefixed with an underscore to signify that they are private.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1010 Always use accessor methods. If the accessor doesn't exist or is inadequate,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1011 create or modify an accessor (and let me know, too!).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1012
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1013 =item 2 This documentation may be incomplete and out of date.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1014
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1015 It is easy for this documentation to become obsolete as this module is still evolving.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1016 Always double check this info and search for members not described here.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1017
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1018 =back
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1019
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1020 Bio::Root::Vector.pm objects currently cannot be instantiated. Vector.pm must be inherited
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1021 along with Bio::Root::Object.pm (or an object that provides a constructor).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1022 Vector.pm defines the following fields:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1023
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1024 FIELD VALUE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1025 ------------------------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1026 _prev Reference to the previous object in the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1027
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1028 _next Reference to the next object in the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1029
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1030 _rank Rank relative to other objects in the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1031 Default rank = chronological order of addition to the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1032
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1033 _master A reference to an Bio::Root::Object that acts as a manager for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1034 the given Vector. There is only one master per Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1035 A master object is only needed when the Vector size is >1.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1036 The master object manages the following Vector data:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1037
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1038 _first - Reference to the first object in the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1039 _last - Reference to the last object in the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1040 _size - Total number of objects in the Vector.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1041 _rankBy - Criteria used to rank the object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1042 Default: chronological order of addition.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1043 _index - Hash reference for quick access to any object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1044 based on its name.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1045 Bio::Root::Object{'_err'} - Holds any errors affecting the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1046 Vector as a whole.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1047
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1048 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1049
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1050 1;