annotate variant_effect_predictor/Bio/EnsEMBL/Utils/Eprof.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 =head1 LICENSE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4 Genome Research Limited. All rights reserved.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 This software is distributed under a modified Apache license.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 For license details, please see
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 http://www.ensembl.org/info/about/code_licence.html
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 =head1 CONTACT
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 Please email comments or questions to the public Ensembl
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14 developers list at <dev@ensembl.org>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16 Questions may also be sent to the Ensembl help desk at
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 <helpdesk@ensembl.org>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 Bio::EnsEMBL::Utils::Eprof - Bespoke Ensembl profiler
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 use Bio::EnsEMBL::Utils::Eprof( 'eprof_start', 'eprof_end',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28 'eprof_dump' );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 &eprof_start('function-a');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 # ... do something
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 &eprof_end('function-a');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 &eprof_dump( \*STDERR );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 # there is an object based set for above as well, for running
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 # multiple concurrent profilers
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 This is an Ensembl profiler as we broke the Perl profilers.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 =head1 METHODS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47 package Bio::EnsEMBL::Utils::Eprof;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 use warnings;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 use Bio::EnsEMBL::Utils::Exception ('throw');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53 use Bio::EnsEMBL::Utils::EprofStack;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55 use base qw( Exporter );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 our @EXPORT_OK =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 ( 'eprof_start', 'eprof_end', 'eprof_dump', 'eprof_reset' );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 my $global;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 my ($proto) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 my $class = ref($proto) || $proto;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 my $self = bless( { '_tags' => {} }, $class );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68 return $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 =head2 eprof_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 Title : eprof_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 Usage :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 Function:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 Returns :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 Args :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 sub eprof_start {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 my ($tag) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 if ( !defined($global) ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 $global = Bio::EnsEMBL::Utils::Eprof->new();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90 $global->start($tag);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 =head2 eprof_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 Title : eprof_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 Usage :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 Function:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 Returns :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 Args :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 sub eprof_end {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 my ($tag) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 if ( !defined($global) ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 $global = Bio::EnsEMBL::Utils::Eprof->new();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 $global->end($tag);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 sub eprof_dump {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 my ($fh) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 if ( !defined($global) ) { return }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 $global->dump($fh);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 =head2 eprof_reset
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 Title : eprof_reset
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 Usage :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 Function:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129 Returns :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 Args :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 sub eprof_reset { undef($global) }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 =head2 dump
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 Title : dump
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 Usage :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 Function:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 Returns :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 Args :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 sub dump {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 my ( $self, $fh ) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 my @tags = sort {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153 $self->_tags()->{$a}->total_time()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154 <=> $self->_tags()->{$b}->total_time()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 } keys %{ $self->_tags() };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 foreach my $tag (@tags) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 my $st = $self->_tags->{$tag};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 if ( $st->number() == 0 ) { next }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 my $STD = '---';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 if ( $st->number() > 1 ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165 my $SS =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 $st->total_time_time() -
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 $st->total_time()*$st->total_time()/$st->number();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 if ( $SS > 0 ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 $STD = sprintf( "%6f",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 sqrt( $SS/$st->number()/( $st->number() - 1 ) )
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 print( $fh sprintf( "Eprof: %20s %6f %6f %d %s [%6f,%6f]\n",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 $st->tag(), $st->total_time(),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 $st->total_time()/$st->number(), $st->number(),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 $STD, $st->min_time(),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 $st->max_time() ) );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 } ## end foreach my $tag (@tags)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 } ## end sub dump
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 =head2 start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 Title : start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 Usage : $eprof->start('this_tag');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 Function:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 Returns :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191 Args :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 sub start {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 my ( $self, $tag ) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 if ( !defined($tag) ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 $self->throw("No tag, can't start.");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 if ( !defined( $self->_tags()->{$tag} ) ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 $self->_tags()->{$tag} = Bio::EnsEMBL::Utils::EprofStack->new($tag);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 $self->_tags()->{$tag}->push_stack();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 =head2 end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 Title : end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213 Usage : $eprof->end('this_tag');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 Function:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 Returns :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 Args :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218
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 end {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 my ( $self, $tag ) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225 if ( !defined($tag) ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 $self->throw("No tag, can't end.");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 if ( !defined( $self->_tags()->{$tag} ) ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 $self->throw(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 sprintf( "Ending with a nonexistant tag '%s'", $tag ) );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234 $self->_tags->{$tag}->pop_stack();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 =head2 _tags
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239 Title : _tags
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 Usage : $obj->_tags($newval)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241 Function:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 Returns : value of _tags
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 Args : newvalue (optional)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 sub _tags {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 my ($obj) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 return $obj->{'_tags'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254