BioPerl
view release on metacpan or search on metacpan
Bio/Annotation/AnnotationFactory.pm view on Meta::CPAN
the Bioperl mailing list. Your participation is much appreciated.
bioperl-l@bioperl.org - General discussion
http://bioperl.org/wiki/Mailing_lists - About the mailing lists
=head2 Support
Please direct usage questions or support issues to the mailing list:
I<bioperl-l@bioperl.org>
rather than to the module maintainer directly. Many experienced and
reponsive experts will be able look at the problem and quickly
address it. Please include a thorough description of the problem
with code and data examples if at all possible.
=head2 Reporting Bugs
Report bugs to the Bioperl bug tracking system to help us keep track
of the bugs and their resolution. Bug reports can be submitted via
the web:
https://github.com/bioperl/bioperl-live/issues
=head1 AUTHOR - Hilmar Lapp
Email hlapp at gmx.net
=head1 CONTRIBUTORS
This is mostly copy-and-paste with subsequent adaptation from
Bio::Seq::SeqFactory by Jason Stajich. Most credits should in fact go
to him.
=head1 APPENDIX
The rest of the documentation details each of the object methods.
Internal methods are usually preceded with a _
=cut
# Let the code begin...
package Bio::Annotation::AnnotationFactory;
use strict;
use base qw(Bio::Root::Root Bio::Factory::ObjectFactoryI);
=head2 new
Title : new
Usage : my $obj = Bio::Annotation::AnnotationFactory->new();
Function: Builds a new Bio::Annotation::AnnotationFactory object
Returns : Bio::Annotation::AnnotationFactory
Args : -type => string, name of a L<Bio::AnnotationI> derived class.
If type is not set the module guesses it based on arguments passed to
method L<create_object>.
=cut
sub new {
my($class,@args) = @_;
my $self = $class->SUPER::new(@args);
my ($type) = $self->_rearrange([qw(TYPE)], @args);
$self->{'_loaded_types'} = {};
$self->type($type) if $type;
return $self;
}
=head2 create_object
Title : create_object
Usage : my $seq = $factory->create_object(<named parameters>);
Function: Instantiates new Bio::AnnotationI (or one of its child classes)
This object allows us to genericize the instantiation of
cluster objects.
Returns : L<Bio::AnnotationI> compliant object
The return type is configurable using new(-type =>"...").
Args : initialization parameters specific to the type of annotation
object we want.
=cut
sub create_object {
my ($self,@args) = @_;
my $type = $self->type;
if(! $type) {
# we need to guess this
$type = $self->_guess_type(@args);
if(! $type) {
$self->throw("No annotation type set and unable to guess.");
}
# load dynamically if it hasn't been loaded yet
if(! $self->{'_loaded_types'}->{$type}) {
eval {
$self->_load_module($type);
$self->{'_loaded_types'}->{$type} = 1;
};
if($@) {
$self->throw("Bio::AnnotationI implementation $type ".
"failed to load: ".$@);
}
}
}
return $type->new(-verbose => $self->verbose, @args);
}
=head2 type
Title : type
Usage : $obj->type($newval)
Function: Get/set the type of L<Bio::AnnotationI> object to be created.
This may be changed at any time during the lifetime of this
factory.
Returns : value of type
Args : newvalue (optional)
=cut
sub type{
my $self = shift;
if(@_) {
my $type = shift;
if($type && (! $self->{'_loaded_types'}->{$type})) {
eval {
$self->_load_module($type);
};
if( $@ ) {
$self->throw("Annotation class '$type' failed to load: ".
$@);
}
my $a = bless {},$type;
if( ! $a->isa('Bio::AnnotationI') ) {
$self->throw("'$type' does not implement Bio::AnnotationI. ".
"Too bad.");
}
$self->{'_loaded_types'}->{$type} = 1;
}
return $self->{'type'} = $type;
}
return $self->{'type'};
}
=head2 _guess_type
Title : _guess_type
Usage :
Function: Guesses the right type of L<Bio::AnnotationI> implementation
based on initialization parameters for the prospective
object.
Example :
Returns : the type (a string, the module name)
Args : initialization parameters to be passed to the prospective
cluster object
=cut
sub _guess_type{
my ($self,@args) = @_;
my $type;
# we can only guess from a certain number of arguments
my ($val, $db, $text, $name, $authors, $start, $tree, $node) =
$self->_rearrange([qw(VALUE
DATABASE
TEXT
NAME
AUTHORS
START
TREE_OBJ
NODE
)], @args);
SWITCH: {
$val && do { $type = ref($val) ? "TagTree" : "SimpleValue"; last SWITCH; };
$authors && do { $type = "Reference"; last SWITCH; };
$db && do { $type = "DBLink"; last SWITCH; };
$text && do { $type = "Comment"; last SWITCH; };
$name && do { $type = "OntologyTerm"; last SWITCH; };
$start && do { $type = "Target"; last SWITCH; };
$tree && do { $type = "Tree"; last SWITCH; };
$node && do { $type = "TagTree"; last SWITCH; };
# what else could we look for?
}
$type = "Bio::Annotation::".$type;
return $type;
}
#####################################################################
# aliases for naming consistency or other reasons #
#####################################################################
*create = \&create_object;
1;
( run in 0.631 second using v1.01-cache-2.11-cpan-39bf76dae61 )