Mercurial > repos > mahtabm > ensembl
comparison variant_effect_predictor/Bio/Biblio/BiblioBase.pm @ 0:1f6dce3d34e0
Uploaded
| author | mahtabm |
|---|---|
| date | Thu, 11 Apr 2013 02:01:53 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:1f6dce3d34e0 |
|---|---|
| 1 # $Id: BiblioBase.pm,v 1.9 2002/10/22 07:45:11 lapp Exp $ | |
| 2 # | |
| 3 # BioPerl module for Bio::Biblio::BiblioBase | |
| 4 # | |
| 5 # Cared for by Martin Senger <senger@ebi.ac.uk> | |
| 6 # For copyright and disclaimer see below. | |
| 7 | |
| 8 # POD documentation - main docs before the code | |
| 9 | |
| 10 =head1 NAME | |
| 11 | |
| 12 Bio::Biblio::BiblioBase - An abstract base for other biblio classes | |
| 13 | |
| 14 =head1 SYNOPSIS | |
| 15 | |
| 16 # do not instantiate this class directly | |
| 17 | |
| 18 =head1 DESCRIPTION | |
| 19 | |
| 20 It is a base class where all other biblio data storage classes inherit | |
| 21 from. It does not reflect any real-world object, it exists only for | |
| 22 convenience, in order to have a place for shared code. | |
| 23 | |
| 24 =head2 new() | |
| 25 | |
| 26 The I<new()> class method constructs a new biblio storage object. It | |
| 27 accepts list of named arguments - the same names as attribute names | |
| 28 prefixed with a minus sign. Available attribute names are listed in | |
| 29 the documentation of the individual biblio storage objects. | |
| 30 | |
| 31 =head2 Accessors | |
| 32 | |
| 33 All attribute names can be used as method names. When used without any | |
| 34 parameter the method returns current value of the attribute (or | |
| 35 undef), when used with a value the method sets the attribute to this | |
| 36 value and also returns it back. The set method also checks if the type | |
| 37 of the new value is correct. | |
| 38 | |
| 39 =head2 Custom classes | |
| 40 | |
| 41 If there is a need for new attributes, create your own class which | |
| 42 usually inherits from I<Bio::Biblio::Ref>. For new types of providers | |
| 43 and journals, let your class inherit directly from this | |
| 44 I<Bio::Biblio::BiblioBase> class. | |
| 45 | |
| 46 =head1 FEEDBACK | |
| 47 | |
| 48 =head2 Mailing Lists | |
| 49 | |
| 50 User feedback is an integral part of the evolution of this and other | |
| 51 Bioperl modules. Send your comments and suggestions preferably to | |
| 52 the Bioperl mailing list. Your participation is much appreciated. | |
| 53 | |
| 54 bioperl-l@bioperl.org - General discussion | |
| 55 http://bioperl.org/MailList.shtml - About the mailing lists | |
| 56 | |
| 57 =head2 Reporting Bugs | |
| 58 | |
| 59 Report bugs to the Bioperl bug tracking system to help us keep track | |
| 60 of the bugs and their resolution. Bug reports can be submitted via | |
| 61 email or the web: | |
| 62 | |
| 63 bioperl-bugs@bioperl.org | |
| 64 http://bugzilla.bioperl.org/ | |
| 65 | |
| 66 =head1 AUTHOR | |
| 67 | |
| 68 Martin Senger (senger@ebi.ac.uk) | |
| 69 | |
| 70 =head1 COPYRIGHT | |
| 71 | |
| 72 Copyright (c) 2002 European Bioinformatics Institute. All Rights Reserved. | |
| 73 | |
| 74 This module is free software; you can redistribute it and/or modify | |
| 75 it under the same terms as Perl itself. | |
| 76 | |
| 77 =head1 DISCLAIMER | |
| 78 | |
| 79 This software is provided "as is" without warranty of any kind. | |
| 80 | |
| 81 =cut | |
| 82 | |
| 83 | |
| 84 # Let the code begin... | |
| 85 | |
| 86 | |
| 87 package Bio::Biblio::BiblioBase; | |
| 88 use strict; | |
| 89 use vars qw(@ISA $AUTOLOAD); | |
| 90 | |
| 91 use Bio::Root::Root; | |
| 92 | |
| 93 @ISA = qw(Bio::Root::Root); | |
| 94 | |
| 95 # these methods should not be called here; | |
| 96 # they should be implemented by a subclass | |
| 97 sub _accessible { shift->throw_not_implemented(); } | |
| 98 sub _attr_type { shift->throw_not_implemented(); } | |
| 99 | |
| 100 # | |
| 101 # deal with 'set_' and 'get_' methods | |
| 102 # | |
| 103 sub AUTOLOAD { | |
| 104 my ($self, $newval) = @_; | |
| 105 | |
| 106 if ($AUTOLOAD =~ /.*::(\w+)/ && $self->_accessible ("_$1")) { | |
| 107 my $attr_name = "_$1"; | |
| 108 my $attr_type = $self->_attr_type ($attr_name); | |
| 109 my $ref_sub = | |
| 110 sub { | |
| 111 my ($this, $new_value) = @_; | |
| 112 return $this->{$attr_name} unless defined $new_value; | |
| 113 | |
| 114 # here we continue with 'set' method | |
| 115 my ($newval_type) = ref ($new_value) || 'string'; | |
| 116 my ($expected_type) = $attr_type || 'string'; | |
| 117 # $this->throw ("In method $AUTOLOAD, trying to set a value of type '$newval_type' but '$expected_type' is expected.") | |
| 118 $this->throw ($this->_wrong_type_msg ($newval_type, $expected_type, $AUTOLOAD)) | |
| 119 unless ($newval_type eq $expected_type) or | |
| 120 UNIVERSAL::isa ($new_value, $expected_type); | |
| 121 | |
| 122 $this->{$attr_name} = $new_value; | |
| 123 return $new_value; | |
| 124 }; | |
| 125 | |
| 126 no strict 'refs'; | |
| 127 *{$AUTOLOAD} = $ref_sub; | |
| 128 use strict 'refs'; | |
| 129 return $ref_sub->($self, $newval); | |
| 130 } | |
| 131 | |
| 132 $self->throw ("No such method: $AUTOLOAD"); | |
| 133 } | |
| 134 | |
| 135 # | |
| 136 | |
| 137 sub new { | |
| 138 my ($caller, @args) = @_; | |
| 139 my $class = ref ($caller) || $caller; | |
| 140 | |
| 141 # create and bless a new instance | |
| 142 my ($self) = $class->SUPER::new (@args); | |
| 143 | |
| 144 # make a hashtable from @args | |
| 145 my %param = @args; | |
| 146 @param { map { lc $_ } keys %param } = values %param; # lowercase keys | |
| 147 | |
| 148 # set all @args into this object with 'set' values; | |
| 149 # change '-key' into '_key', and making keys lowercase | |
| 150 my $new_key; | |
| 151 foreach my $key (keys %param) { | |
| 152 ($new_key = $key) =~ s/-/_/og; # change it everywhere, why not | |
| 153 my $method = lc (substr ($new_key, 1)); # omitting the first '_' | |
| 154 no strict 'refs'; | |
| 155 $method->($self, $param { $key }); | |
| 156 } | |
| 157 | |
| 158 # done | |
| 159 return $self; | |
| 160 } | |
| 161 | |
| 162 # | |
| 163 # set methods test whether incoming value is of a correct type; | |
| 164 # here we return message explaining it | |
| 165 # | |
| 166 sub _wrong_type_msg { | |
| 167 my ($self, $given_type, $expected_type, $method) = @_; | |
| 168 my $msg = 'In method '; | |
| 169 if (defined $method) { | |
| 170 $msg .= $method; | |
| 171 } else { | |
| 172 $msg .= (caller(1))[3]; | |
| 173 } | |
| 174 return ("$msg: Trying to set a value of type '$given_type' but '$expected_type' is expected."); | |
| 175 } | |
| 176 | |
| 177 # | |
| 178 # probably just for debugging | |
| 179 # TBD: to decide... | |
| 180 # | |
| 181 sub print_me { | |
| 182 my ($self) = @_; | |
| 183 require Data::Dumper; | |
| 184 return Data::Dumper->Dump ( [$self], ['Citation']); | |
| 185 } | |
| 186 | |
| 187 1; | |
| 188 __END__ |
