annotate variant_effect_predictor/Bio/EnsEMBL/Utils/Scalar.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 package Bio::EnsEMBL::Utils::Scalar;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 =pod
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5 =head1 LICENSE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 Copyright (c) 1999-2012 The European Bioinformatics Institute and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8 Genome Research Limited. All rights reserved.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10 This software is distributed under a modified Apache license.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 For license details, please see
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 http://www.ensembl.org/info/about/code_licence.html
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15 =head1 CONTACT
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 Please email comments or questions to the public Ensembl
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18 developers list at <dev@ensembl.org>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20 Questions may also be sent to the Ensembl help desk at
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 <helpdesk@ensembl.org>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 =pod
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 Bio::EnsEMBL::Utils::Scalar
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 use Bio::EnsEMBL::Utils::Scalar qw(check_ref assert_ref wrap_array check_ref_can assert_ref_can assert_numeric assert_integer);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 check_ref([], 'ARRAY'); # Will return true
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 check_ref({}, 'ARRAY'); # Will return false
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 check_ref($dba, 'Bio::EnsEMBL::DBSQL::DBAdaptor'); #Returns true if $dba is a DBAdaptor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 assert_ref([], 'ARRAY'); #Returns true
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 assert_ref({}, 'ARRAY'); #throws an exception
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 assert_ref($dba, 'Bio::EnsEMBL::Gene'); #throws an exception if $dba is not a Gene
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 wrap_array([]); #Returns the same reference
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44 wrap_array($a); #Returns [$a] if $a was not an array
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 wrap_array(undef); #Returns [] since incoming was undefined
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 wrap_array(); #Returns [] since incoming was empty (therefore undefined)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 check_ref_can([], 'dbID'); #returns false as ArrayRef is not blessed
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 check_ref_can($gene, 'dbID'); #returns true as Gene should implement dbID()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 check_ref_can(undef); #Throws an exception as we gave no method to test
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 assert_ref_can([], 'dbID'); #throws an exception since ArrayRef is not blessed
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53 assert_ref_can($gene, 'dbID'); #returns true if gene implements dbID()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 assert_ref_can(undef); #Throws an exception as we gave no method to test
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 asssert_integer(1, 'dbID'); #Passes
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 asssert_integer(1.1, 'dbID'); #Fails
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 asssert_numeric(1E-11, 'dbID'); #Passes
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 asssert_numeric({}, 'dbID'); #Fails
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 #Tags are also available for exporting
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 use Bio::EnsEMBL::Utils::Scalar qw(:assert); # brings in all assert methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 use Bio::EnsEMBL::Utils::Scalar qw(:check); #brings in all check methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64 use Bio::EnsEMBL::Utils::Scalar qw(:array); #brings in wrap_array
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 use Bio::EnsEMBL::Utils::Scalar qw(:all); #import all methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 A collection of subroutines aimed to helping Scalar based operations
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 =head1 METHODS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 See subroutines.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 =head1 MAINTAINER
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 $Author: ady $
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79 =head1 VERSION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 $Revision: 1.12 $
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 use warnings;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 use base qw(Exporter);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90 our %EXPORT_TAGS;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 our @EXPORT_OK;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 @EXPORT_OK = qw(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 check_ref check_ref_can
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 assert_ref assert_ref_can assert_numeric assert_integer assert_boolean assert_strand assert_file_handle
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 wrap_array
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 %EXPORT_TAGS = (
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 assert => [qw(assert_ref assert_ref_can assert_integer assert_numeric assert_boolean assert_strand assert_file_handle)],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 check => [qw(check_ref check_ref_can)],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 array => [qw/wrap_array/],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 all => [@EXPORT_OK]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 use Bio::EnsEMBL::Utils::Exception qw(throw);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 use Scalar::Util qw(blessed looks_like_number openhandle);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 =head2 check_ref()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 Arg [1] : The reference to check
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 Arg [2] : The type we expect
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 Description : A subroutine which checks to see if the given object/ref is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 what you expect. If you give it a blessed reference then it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114 will perform an isa() call on the object after the defined
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 tests. If it is a plain reference then it will use ref().
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 An undefined value will return a false.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 Returntype : Boolean indicating if the reference was the type we
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 expect
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 Example : my $ok = check_ref([], 'ARRAY');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 Exceptions : If the expected type was not set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 sub check_ref {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 my ($ref, $expected) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 throw('No expected type given') if ! defined $expected;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129 if(defined $ref) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 if(blessed($ref)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131 return 1 if $ref->isa($expected);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 my $ref_ref_type = ref($ref);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 return 1 if defined $ref_ref_type && $ref_ref_type eq $expected;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138 return 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 =head2 assert_ref()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 Arg [1] : The reference to check
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 Arg [2] : The type we expect
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145 Arg [3] : The attribute name you are asserting; not required but allows
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 for more useful error messages to be generated. Defaults to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 C<-Unknown->.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148 Description : A subroutine which checks to see if the given object/ref is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 what you expect. This behaves in an identical manner as
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 C<check_ref()> does except this will raise exceptions when
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 the values do not match rather than returning a boolean
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 indicating the situation.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154 Undefs cause exception circumstances.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 Returntype : Boolean; true if we managed to get to the return
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 Example : assert_ref([], 'ARRAY');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 Exceptions : If the expected type was not set and if the given reference
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 was not assignable to the expected value
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163 sub assert_ref {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 my ($ref, $expected, $attribute_name) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165 $attribute_name ||= '-Unknown-';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 throw('No expected type given') if ! defined $expected;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 my $class = ref($ref);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 throw("The given reference for attribute $attribute_name was undef") unless defined $ref;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 throw("Asking for the type of the attribute $attribute_name produced no type; check it is a reference") unless $class;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 if(blessed($ref)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 throw("${attribute_name}'s type '${class}' is not an ISA of '${expected}'") if ! $ref->isa($expected);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 throw("$attribute_name was expected to be '${expected}' but was '${class}'") if $expected ne $class;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 =head2 wrap_array()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 Arg : The reference we want to wrap in an array
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 Description : Takes in a reference and returns either the reference if it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183 was already an array, the reference wrapped in an array or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 an empty array (if the given value was undefined).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 Returntype : Array Reference
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 Example : my $a = wrap_array($input);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192 sub wrap_array {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193 my ($incoming_reference) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 if(defined $incoming_reference) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 if(check_ref($incoming_reference, 'ARRAY')) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 return $incoming_reference;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 return [$incoming_reference];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 return [];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 =head2 check_ref_can
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 Arg [1] : The reference to check
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 Arg [2] : The method we expect to run
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 Description : A subroutine which checks to see if the given object/ref is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 implements the given method. This is very similar to the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211 functionality given by C<UNIVERSAL::can()> but works
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 by executing C<can()> on the object meaning we consult the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213 object's potentially overriden version rather than Perl's
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 default mechanism.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 Returntype : CodeRef
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 Example : check_ref_can($gene, 'dbID');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 Exceptions : If the expected type was not set.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 sub check_ref_can {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 my ($ref, $method) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 throw('No method given') if ! defined $method;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225 return unless defined $ref && blessed($ref);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 return $ref->can($method);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 =head2 assert_ref_can
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 Arg [1] : The reference to check
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 Arg [2] : The method we expect to run
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233 Arg [3] : The attribute name you are asserting; not required but allows
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234 for more useful error messages to be generated. Defaults to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 C<-Unknown->.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 Description : A subroutine which checks to see if the given object/ref is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 implements the given method. Will throw exceptions.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 Returntype : Boolean; true if we managed to get to the return
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239 Example : assert_ref_can($gene, 'dbID');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 Exceptions : If the reference is not defined, if the object does not
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241 implement the given method and if no method was given to check
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 sub assert_ref_can {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 my ($ref, $method, $attribute_name) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 $attribute_name ||= '-Unknown-';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 throw('No method given') if ! defined $method;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 throw "The given reference $attribute_name is not defined" unless defined $ref;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 throw "The given reference $attribute_name is not blessed" unless blessed($ref);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 if(! $ref->can($method)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 my $str_ref = ref($ref);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 throw sprintf(q{The given blessed reference '%s' for attribute '%s' does not implement the method '%s'}, $str_ref, $attribute_name, $method);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256 return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259 =head2 assert_numeric
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 Arg [1] : The Scalar to check
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262 Arg [2] : The attribute name you are asserting; not required but allows
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 for more useful error messages to be generated. Defaults to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264 C<-Unknown->.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265 Description : A subroutine which checks to see if the given scalar is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266 number or not. If not then we raise exceptions detailing why
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 Returntype : Boolean; true if we had a numeric otherwise we signal failure
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268 via exceptions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 Example : assert_numeric(1, 'dbID');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 Exceptions : If the Scalar is not defined, if the Scalar was blessed and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 if the value was not a number
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 sub assert_numeric {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277 my ($integer, $attribute_name) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278 $attribute_name ||= '-Unknown-';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 throw "$attribute_name attribute is undefined" if ! defined $integer;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 throw "The given attribute $attribute_name is blessed; cannot work with blessed values" if blessed($integer);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281 if(! looks_like_number($integer)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 throw "Attribute $attribute_name was not a number";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284 return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287 =head2 assert_integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 Arg [1] : The Scalar to check
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 Arg [2] : The attribute name you are asserting; not required but allows
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 for more useful error messages to be generated. Defaults to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292 C<-Unknown->.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 Description : A subroutine which checks to see if the given scalar is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 a whole integer; we delegate to L<assert_numeric> for number
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295 checking.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 Returntype : Boolean; true if we had a numeric otherwise we signal failure
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297 via exceptions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 Example : assert_integer(1, 'dbID');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 Exceptions : See L<assert_numeric> and we raise exceptions if the value
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300 was not a whole integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 sub assert_integer {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306 my ($integer, $attribute_name) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 $attribute_name ||= '-Unknown-';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 assert_numeric($integer, $attribute_name);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 if($integer != int($integer)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 throw "Attribute $attribute_name was a number but not an Integer";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312 return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315 =head2 assert_boolean
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 Arg [1] : The Scalar to check
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318 Arg [2] : The attribute name you are asserting; not required but allows
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 for more useful error messages to be generated. Defaults to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 C<-Unknown->.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 Description : A subroutine which checks to see if the given scalar is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 a boolean i.e. value is set to C<1> or C<0>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 Returntype : Boolean; true if we were given a boolean otherwise we signal
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324 failure via exceptions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 Example : assert_boolean(1, 'is_circular');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326 Exceptions : See L<assert_integer> and we raise exceptions if the value
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 was not equal to the 2 valid states
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 sub assert_boolean {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 my ($boolean, $attribute_name) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334 $attribute_name ||= '-Unknown-';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 assert_numeric($boolean, $attribute_name);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 if($boolean != 0 && $boolean != 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337 throw "Attribute $attribute_name was an invalid boolean. Expected: 1 or 0. Got: $boolean";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342 =head2 assert_strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 Arg [1] : The Scalar to check
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 Arg [2] : The attribute name you are asserting; not required but allows
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346 for more useful error messages to be generated. Defaults to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 C<-Unknown->.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 Description : A subroutine which checks to see if the given scalar is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349 a whole integer and if the value is set to C<1>, C<0> or C<-1>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350 Returntype : Boolean; true if we had a strand integer otherwise we signal
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351 failure via exceptions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352 Example : assert_strand(1, 'strand');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353 Exceptions : See L<assert_integer> and we raise exceptions if the value
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354 was not equal to the 3 valid states
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359 sub assert_strand {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360 my ($strand, $attribute_name) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361 $attribute_name ||= '-Unknown-';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362 assert_numeric($strand, $attribute_name);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363 if($strand != -1 && $strand != 0 && $strand ne 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 throw "Attribute $attribute_name was an invalid strand. Expected: 1, 0 or -1. Got: $strand";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366 return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 =head2 assert_file_handle
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 Arg [1] : The Scalar to check
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373 Arg [2] : The attribute name you are asserting; not required but allows
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374 for more useful error messages to be generated. Defaults to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 C<-Unknown->.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376 Description : A subroutine which checks to see if the given scalar is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 actually a file handle. This will handle those which are Glob
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378 references and those which inherit from C<IO::Handle>. It will
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379 also cope with a blessed Glob reference.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380 Returntype : Boolean;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 Example : assert_file_handle($fh, '-FILE_HANDLE');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 Exceptions : Raised if not defined, not a reference and was not a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 GLOB or did not inherit from IO::Handle
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388 sub assert_file_handle {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389 my ($file_handle, $attribute_name) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 $attribute_name ||= '-Unknown-';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 throw "Attribute $attribute_name was undefined" if ! defined $file_handle;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392 my $ref = ref($file_handle);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393 throw "Attribute $attribute_name was not a reference. Got: $file_handle" if ! $ref;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 if(!openhandle($file_handle)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395 if(blessed($file_handle)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 if(! $file_handle->isa('IO::Handle')) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 throw "Attribute $attribute_name was blessed but did not inherit from IO::Handle. Ref was: $ref";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401 throw "Attribute $attribute_name was not a file handle. Ref was: $ref";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404 return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 1;