Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/Biblio/BiblioBase.pm @ 0:1f6dce3d34e0
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 02:01:53 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/Biblio/BiblioBase.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,188 @@ +# $Id: BiblioBase.pm,v 1.9 2002/10/22 07:45:11 lapp Exp $ +# +# BioPerl module for Bio::Biblio::BiblioBase +# +# Cared for by Martin Senger <senger@ebi.ac.uk> +# For copyright and disclaimer see below. + +# POD documentation - main docs before the code + +=head1 NAME + +Bio::Biblio::BiblioBase - An abstract base for other biblio classes + +=head1 SYNOPSIS + + # do not instantiate this class directly + +=head1 DESCRIPTION + +It is a base class where all other biblio data storage classes inherit +from. It does not reflect any real-world object, it exists only for +convenience, in order to have a place for shared code. + +=head2 new() + +The I<new()> class method constructs a new biblio storage object. It +accepts list of named arguments - the same names as attribute names +prefixed with a minus sign. Available attribute names are listed in +the documentation of the individual biblio storage objects. + +=head2 Accessors + +All attribute names can be used as method names. When used without any +parameter the method returns current value of the attribute (or +undef), when used with a value the method sets the attribute to this +value and also returns it back. The set method also checks if the type +of the new value is correct. + +=head2 Custom classes + +If there is a need for new attributes, create your own class which +usually inherits from I<Bio::Biblio::Ref>. For new types of providers +and journals, let your class inherit directly from this +I<Bio::Biblio::BiblioBase> class. + +=head1 FEEDBACK + +=head2 Mailing Lists + +User feedback is an integral part of the evolution of this and other +Bioperl modules. Send your comments and suggestions preferably to +the Bioperl mailing list. Your participation is much appreciated. + + bioperl-l@bioperl.org - General discussion + http://bioperl.org/MailList.shtml - About the mailing lists + +=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 +email or the web: + + bioperl-bugs@bioperl.org + http://bugzilla.bioperl.org/ + +=head1 AUTHOR + +Martin Senger (senger@ebi.ac.uk) + +=head1 COPYRIGHT + +Copyright (c) 2002 European Bioinformatics Institute. All Rights Reserved. + +This module is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 DISCLAIMER + +This software is provided "as is" without warranty of any kind. + +=cut + + +# Let the code begin... + + +package Bio::Biblio::BiblioBase; +use strict; +use vars qw(@ISA $AUTOLOAD); + +use Bio::Root::Root; + +@ISA = qw(Bio::Root::Root); + +# these methods should not be called here; +# they should be implemented by a subclass +sub _accessible { shift->throw_not_implemented(); } +sub _attr_type { shift->throw_not_implemented(); } + +# +# deal with 'set_' and 'get_' methods +# +sub AUTOLOAD { + my ($self, $newval) = @_; + + if ($AUTOLOAD =~ /.*::(\w+)/ && $self->_accessible ("_$1")) { + my $attr_name = "_$1"; + my $attr_type = $self->_attr_type ($attr_name); + my $ref_sub = + sub { + my ($this, $new_value) = @_; + return $this->{$attr_name} unless defined $new_value; + + # here we continue with 'set' method + my ($newval_type) = ref ($new_value) || 'string'; + my ($expected_type) = $attr_type || 'string'; +# $this->throw ("In method $AUTOLOAD, trying to set a value of type '$newval_type' but '$expected_type' is expected.") + $this->throw ($this->_wrong_type_msg ($newval_type, $expected_type, $AUTOLOAD)) + unless ($newval_type eq $expected_type) or + UNIVERSAL::isa ($new_value, $expected_type); + + $this->{$attr_name} = $new_value; + return $new_value; + }; + + no strict 'refs'; + *{$AUTOLOAD} = $ref_sub; + use strict 'refs'; + return $ref_sub->($self, $newval); + } + + $self->throw ("No such method: $AUTOLOAD"); +} + +# + +sub new { + my ($caller, @args) = @_; + my $class = ref ($caller) || $caller; + + # create and bless a new instance + my ($self) = $class->SUPER::new (@args); + + # make a hashtable from @args + my %param = @args; + @param { map { lc $_ } keys %param } = values %param; # lowercase keys + + # set all @args into this object with 'set' values; + # change '-key' into '_key', and making keys lowercase + my $new_key; + foreach my $key (keys %param) { + ($new_key = $key) =~ s/-/_/og; # change it everywhere, why not + my $method = lc (substr ($new_key, 1)); # omitting the first '_' + no strict 'refs'; + $method->($self, $param { $key }); + } + + # done + return $self; +} + +# +# set methods test whether incoming value is of a correct type; +# here we return message explaining it +# +sub _wrong_type_msg { + my ($self, $given_type, $expected_type, $method) = @_; + my $msg = 'In method '; + if (defined $method) { + $msg .= $method; + } else { + $msg .= (caller(1))[3]; + } + return ("$msg: Trying to set a value of type '$given_type' but '$expected_type' is expected."); +} + +# +# probably just for debugging +# TBD: to decide... +# +sub print_me { + my ($self) = @_; + require Data::Dumper; + return Data::Dumper->Dump ( [$self], ['Citation']); +} + +1; +__END__