annotate Roary/lib/Bio/Roary/ExtractProteomeFromGFF.pm @ 3:e95344f6dfc5 draft default tip

Uploaded
author dereeper
date Fri, 12 Nov 2021 16:32:26 +0000
parents c47a5f61bc9f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
1 package Bio::Roary::ExtractProteomeFromGFF;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
2
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
3 # ABSTRACT: Take in a GFF file and create protein sequences in FASTA format
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
4
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
5 =head1 SYNOPSIS
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
6
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
7 Take in GFF files and create protein sequences in FASTA format
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
8 use Bio::Roary::ExtractProteomeFromGFF;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
9
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
10 my $obj = Bio::Roary::ExtractProteomeFromGFF->new(
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
11 gff_file => $fasta_file,
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
12 );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
13 $obj->fasta_file();
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
14
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
15 =cut
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
16
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
17 use Moose;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
18 use Bio::SeqIO;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
19 use Cwd;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
20 use Bio::Roary::Exceptions;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
21 use File::Basename;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
22 use File::Temp;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
23 use File::Copy;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
24 use Bio::Tools::GFF;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
25 with 'Bio::Roary::JobRunner::Role';
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
26 with 'Bio::Roary::BedFromGFFRole';
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
27
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
28 has 'gff_file' => ( is => 'ro', isa => 'Str', required => 1 );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
29 has 'apply_unknowns_filter' => ( is => 'rw', isa => 'Bool', default => 1 );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
30 has 'maximum_percentage_of_unknowns' => ( is => 'ro', isa => 'Num', default => 5 );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
31 has 'output_filename' => ( is => 'ro', isa => 'Str', lazy => 1, builder => '_build_output_filename' );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
32 has 'fasta_file' => ( is => 'ro', isa => 'Str', lazy => 1, builder => '_build_fasta_file' );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
33 has '_working_directory' => ( is => 'ro', isa => 'File::Temp::Dir', default => sub { File::Temp->newdir( DIR => getcwd, CLEANUP => 1 ); } );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
34 has '_working_directory_name' => ( is => 'ro', isa => 'Str', lazy => 1, builder => '_build__working_directory_name' );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
35 has 'translation_table' => ( is => 'rw', isa => 'Int', default => 11 );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
36
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
37 sub _build_fasta_file {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
38 my ($self) = @_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
39 $self->_extract_nucleotide_regions;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
40 $self->_convert_nucleotide_to_protein;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
41 $self->_cleanup_fasta;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
42 $self->_cleanup_intermediate_files;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
43 $self->_filter_fasta_sequences( join('/',($self->output_directory,$self->output_filename)) );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
44 return join('/',($self->output_directory,$self->output_filename));
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
45 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
46
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
47 sub _build__working_directory_name {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
48 my ($self) = @_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
49 return $self->_working_directory->dirname();
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
50 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
51
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
52 sub _build_output_filename {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
53 my ($self) = @_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
54 my ( $filename, $directories, $suffix ) = fileparse( $self->gff_file, qr/\.[^.]*/ );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
55 return join( '/', ( $self->_working_directory_name, $filename . '.faa' ) );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
56 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
57
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
58
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
59
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
60 sub _cleanup_intermediate_files {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
61 my ($self) = @_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
62 unlink( $self->_unfiltered_output_filename );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
63 unlink( $self->_fastatranslate_filename );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
64 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
65
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
66 sub _nucleotide_fasta_file_from_gff_filename {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
67 my ($self) = @_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
68 return join('/',($self->output_directory,join( '.', ( $self->output_filename, 'intermediate.fa' ) )));
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
69 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
70
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
71 sub _extracted_nucleotide_fasta_file_from_bed_filename {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
72 my ($self) = @_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
73 return join('/',($self->output_directory,join( '.', ( $self->output_filename,'intermediate.extracted.fa' ) )));
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
74 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
75
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
76 sub _unfiltered_output_filename {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
77 my $self = shift;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
78 return join('/',($self->output_directory,join( '.', ( $self->output_filename, 'unfiltered.fa' ) )));
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
79 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
80
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
81
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
82 sub _create_nucleotide_fasta_file_from_gff {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
83 my ($self) = @_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
84
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
85 open(my $input_fh, $self->gff_file);
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
86 open(my $output_fh, '>', $self->_nucleotide_fasta_file_from_gff_filename);
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
87 my $at_sequence = 0;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
88 while(<$input_fh>)
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
89 {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
90 my $line = $_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
91 if($line =~/^>/)
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
92 {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
93 $at_sequence = 1;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
94 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
95
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
96 if($at_sequence == 1)
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
97 {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
98 print {$output_fh} $line;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
99 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
100 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
101 close($input_fh);
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
102 close($output_fh);
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
103 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
104
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
105 sub _extract_nucleotide_regions {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
106 my ($self) = @_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
107
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
108 $self->_create_nucleotide_fasta_file_from_gff;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
109 $self->_create_bed_file_from_gff;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
110
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
111 my $cmd =
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
112 'bedtools getfasta -s -fi '
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
113 . $self->_nucleotide_fasta_file_from_gff_filename
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
114 . ' -bed '
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
115 . $self->_bed_output_filename . ' -fo '
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
116 . $self->_extracted_nucleotide_fasta_file_from_bed_filename
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
117 . ' -name > /dev/null 2>&1';
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
118
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
119 $self->logger->debug($cmd);
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
120 system($cmd);
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
121 unlink( $self->_nucleotide_fasta_file_from_gff_filename );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
122 unlink( $self->_bed_output_filename );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
123 unlink( $self->_nucleotide_fasta_file_from_gff_filename . '.fai' );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
124 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
125
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
126 sub _cleanup_fasta {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
127 my $self = shift;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
128 my $infile = $self->_unfiltered_output_filename;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
129 my $outfile = join('/',($self->output_directory,$self->output_filename));
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
130 return unless ( -e $infile );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
131
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
132 open( my $in, '<', $infile );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
133 open( my $out, '>', $outfile );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
134 while ( my $line = <$in> ) {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
135 chomp $line;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
136 if ( $line =~ /^>/ )
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
137 {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
138 $line =~ s/"//g;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
139 # newer versions of Bedtools add (-) or (+) to the end of the sequence name, remove them
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
140 $line =~ s!\([-+]\)!!;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
141 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
142
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
143 if($line =~ /^(>[^:]+)/)
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
144 {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
145 $line = $1;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
146 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
147 print $out "$line\n";
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
148 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
149 close $in;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
150 close $out;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
151 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
152
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
153 sub _fastatranslate_filename {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
154 my ($self) = @_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
155 return join('/',($self->output_directory,join( '.', ( $self->output_filename, 'intermediate.translate.fa' ) )));
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
156 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
157
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
158 sub _fastatranslate {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
159 my ( $self, $inputfile, $outputfile ) = @_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
160
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
161 my $input_fasta_file_obj = Bio::SeqIO->new( -file => $inputfile, -format => 'Fasta' );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
162 my $output_protein_file_obj = Bio::SeqIO->new( -file => ">" . $outputfile, -format => 'Fasta', -alphabet => 'protein' );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
163
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
164 my %protein_sequence_objs;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
165 while ( my $seq = $input_fasta_file_obj->next_seq ) {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
166 $seq->desc(undef);
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
167 my $protseq = $seq->translate( -codontable_id => $self->translation_table );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
168 $output_protein_file_obj->write_seq($protseq);
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
169 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
170 return 1;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
171 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
172
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
173 sub _convert_nucleotide_to_protein {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
174 my ($self) = @_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
175 $self->_fastatranslate( $self->_extracted_nucleotide_fasta_file_from_bed_filename, $self->_unfiltered_output_filename );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
176 unlink( $self->_extracted_nucleotide_fasta_file_from_bed_filename );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
177 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
178
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
179 sub _does_sequence_contain_too_many_unknowns {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
180 my ( $self, $sequence_obj ) = @_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
181 my $maximum_number_of_Xs = int( ( $sequence_obj->length() * $self->maximum_percentage_of_unknowns ) / 100 );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
182 my $number_of_Xs_found = () = $sequence_obj->seq() =~ /X/g;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
183 if ( $number_of_Xs_found > $maximum_number_of_Xs ) {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
184 return 1;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
185 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
186 else {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
187 return 0;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
188 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
189 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
190
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
191 sub _filter_fasta_sequences {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
192 my ( $self, $filename ) = @_;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
193 my $temp_output_file = $filename . '.tmp.filtered.fa';
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
194 my $out_fasta_obj = Bio::SeqIO->new( -file => ">" . $temp_output_file, -format => 'Fasta' );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
195 my $fasta_obj = Bio::SeqIO->new( -file => $filename, -format => 'Fasta' );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
196
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
197 my $sequence_found = 0;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
198
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
199 while ( my $seq = $fasta_obj->next_seq() ) {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
200 if ( $self->_does_sequence_contain_too_many_unknowns($seq) ) {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
201 next;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
202 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
203 $seq->desc(undef);
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
204 $out_fasta_obj->write_seq($seq);
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
205 $sequence_found = 1;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
206 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
207
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
208 if ( $sequence_found == 0 ) {
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
209 $self->logger->error( "Could not extract any protein sequences from "
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
210 . $self->gff_file
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
211 . ". Does the file contain the assembly as well as the annotation?" );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
212 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
213
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
214 # Replace the original file.
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
215 move( $temp_output_file, $filename );
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
216 return 1;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
217 }
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
218
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
219 no Moose;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
220 __PACKAGE__->meta->make_immutable;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
221
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
222 1;
c47a5f61bc9f Uploaded
dereeper
parents:
diff changeset
223