File Coverage

blib/lib/Bio/Das/Type.pm
Criterion Covered Total %
statement 50 72 69.4
branch 20 40 50.0
condition 2 6 33.3
subroutine 12 18 66.6
pod 7 14 50.0
total 91 150 60.6


line stmt bran cond sub pod time code
1             package Bio::Das::Type;
2              
3 1     1   6 use strict;
  1         2  
  1         34  
4             use overload
5 1         10 '""' => 'toString',
6 1     1   5 cmp => '_cmp';
  1         2  
7              
8             sub new {
9 230     230 1 294 my $class = shift;
10 230         6060 my ($id,$method,$category) = @_;
11 230         1466 return bless {id=>$id,
12             method=>$method,
13             category=>$category
14             },$class;
15             }
16             sub id {
17 3030     3030 1 3278 my $self = shift;
18 3030         4323 my $d = $self->{id};
19 3030 100       6304 $self->{id} = shift if @_;
20 3030         11714 $d;
21             }
22             sub method {
23 417     417 1 481 my $self = shift;
24 417         634 my $d = $self->{method};
25 417 100       855 if (@_) {
26 204         295 $self->{method} = $_[0];
27             # hack to allow to work with Bio::DB::GFF aggregators.
28             # There is a workaround here to correct for broken ensembl
29             # das implementation, which lists all methods as "ensembl"
30             # This is actually the source, not the method
31 204 50 33     1931 $self->{method} =~ s/^[^:]+/$_[0]/ if $_[0] && $_[0] ne 'ensembl';
32             }
33 417         1890 $d;
34             }
35             sub method_label {
36 204     204 1 232 my $self = shift;
37 204         286 my $d = $self->{method_label};
38 204 50       520 $self->{method_label} = shift if @_;
39 204         448 $d;
40             }
41             sub category {
42 216     216 1 251 my $self = shift;
43 216         312 my $d = $self->{category};
44 216 100       469 $self->{category} = shift if @_;
45 216         430 $d;
46             }
47             sub count {
48 21     21 0 21 my $self = shift;
49 21         28 my $d = $self->{count};
50 21 50       47 $self->{count} = shift if @_;
51 21         32 $d;
52             }
53             sub reference {
54 0     0 1 0 my $self = shift;
55 0         0 my $d = $self->{reference};
56 0 0       0 $self->{reference} = shift if @_;
57 0         0 $d;
58             }
59             sub has_subparts {
60 0     0 0 0 my $self = shift;
61 0         0 my $d = $self->{has_subparts};
62 0 0       0 $self->{has_subparts} = shift if @_;
63 0         0 $d;
64             }
65             sub has_superparts {
66 0     0 0 0 my $self = shift;
67 0         0 my $d = $self->{has_superparts};
68 0 0       0 $self->{has_superparts} = shift if @_;
69 0         0 $d;
70             }
71             sub source {
72 0     0 0 0 my $self = shift;
73 0         0 my $d = $self->{source};
74 0 0       0 $self->{source} = shift if @_;
75 0         0 $d;
76             }
77             sub label {
78 204     204 1 245 my $self = shift;
79 204         279 my $d = $self->{label};
80 204 50       390 $self->{label} = shift if @_;
81 204         899 $d;
82             }
83             sub toString {
84 2826     2826 0 3468 my $self = shift;
85 2826 100       4916 $self->id || $self->label;
86             }
87              
88             sub type {
89 0     0 0 0 shift->toString;
90             }
91              
92             sub complete {
93 408     408 0 431 my $self = shift;
94 408   33     2375 return defined $self->{id} && defined $self->{method};
95             }
96              
97             # return a key that is a unique combination of
98             # type and method
99             sub _key {
100 408     408   410 my $self = shift;
101 408         1224 local $^W=0;
102 408         881 my @k = $self->{id};
103 408 50       1200 push @k,$self->{method} if exists $self->{method};
104 408 50       890 push @k,$self->{reference} if exists $self->{reference};
105 408 50       1072 push @k,$self->{category} if exists $self->{category};
106 408 50       806 push @k,$self->{has_subparts} if exists $self->{has_subparts};
107 408 50       760 push @k,$self->{has_superparts} if exists $self->{has_subparts};
108 408 100       889 push @k,$self->{method_label} if exists $self->{method_label};
109 408 50       822 push @k,$self->{count} if exists $self->{count};
110 408         2114 join ':',@k;
111             }
112              
113             sub _cmp {
114 0     0     my $self = shift;
115 0           my ($b,$reversed) = @_;
116 0           my $a = $self->toString;
117 0 0         ($a,$b) = ($b,$a) if $reversed;
118 0           $a cmp $b;
119             }
120              
121             1;
122              
123             __END__
124              
125             =head1 NAME
126              
127             Bio::Das::Type - A sequence annotation type
128              
129             =head1 SYNOPSIS
130              
131             use Bio::Das;
132              
133             # contact a DAS server using the "elegans" data source
134             my $das = Bio::Das->new('http://www.wormbase.org/db/das' => 'elegans');
135              
136             # find out what feature types are available
137             my @types = $db->types;
138              
139             # get information on each one
140             for my $t (@types) {
141             my $id = $t->id;
142             my $method = $t->method;
143             my $category = $t->category;
144             my $isreference = $t->reference;
145             my $label = $t->label;
146             my $method_label = $t->method_label;
147             }
148              
149             =head1 DESCRIPTION
150              
151             The Bio::Das::Type class provides information about the type of an
152             annotation. Each type has a category, which is a general description
153             of the type, a unique ID, which names the type, and an optional
154             method, which describes how the type was derived. A type may also be
155             marked as being a landmark that can be used as a reference sequence.
156              
157             Optionally, types can have human readable labels. There is one label
158             for the type itself, and another for the type's method.
159              
160             =head2 OBJECT CREATION
161              
162             Bio::Das::Type objects are created by calling the types() method of a
163             Bio::Das or Bio::Das::Segment object. They are also created implicity
164             when a Bio::Das::Segment::Feature is created.
165              
166             If needed, there is a simple constructor which can be called directly:
167              
168             =over 4
169              
170             =item $type = Bio::Das::Type->new($id,$method,$category)
171              
172             Create and return a Bio::Das::Type object with the indicated typeID,
173             method and category.
174              
175             =back
176              
177             =head2 OBJECT METHODS
178              
179             The following methods are public. Most of them use an accessor
180             calling style. Called without an argument, they return the current
181             value of the attribute. Called with an argument, they change the
182             attribute and return its previous value.
183              
184             =over 4
185              
186             =item $id = $type->id([$newid])
187              
188             Get or set the ID for the type;
189              
190             =item $label = $type->label([$newlabel])
191              
192             Get or set the label for the type;
193              
194             =item $method = $type->method([$newmethod])
195              
196             Get or set the method ID for the type.
197              
198             =item $label = $type->method_label([$newlabel])
199              
200             Get or set the method label for the type.
201              
202             =item $category = $type->category([$newcategory])
203              
204             Get or set the category for the type.
205              
206             =item $reference = $type->reference([$newreference])
207              
208             Get or set the value of the reference attribute. If the attribute is
209             true, then features of this type can be used as reference sequences.
210             However, see LIMITATIONSbelow.
211              
212             =back
213              
214             =head2 LIMITATIONS
215              
216             Due to the requirements of the DAS spec, the reference() method will
217             always return false for types returned by the Bio::Das->types() or
218             Bio::Das::Segment->types() methods. As currently specified, the
219             reference attribute is an attribute of an individual feature, and not
220             of a generic type.
221              
222             =head1 AUTHOR
223              
224             Lincoln Stein <lstein@cshl.org>.
225              
226             Copyright (c) 2001 Cold Spring Harbor Laboratory
227              
228             This library is free software; you can redistribute it and/or modify
229             it under the same terms as Perl itself. See DISCLAIMER.txt for
230             disclaimers of warranty.
231              
232             =head1 SEE ALSO
233              
234             L<Bio::Das>, L<Bio::Das::Segment>,
235             L<Bio::Das::Segment::Feature>
236              
237             =cut
238