2 # BioPerl module for Bio::Factory::ObjectFactory
4 # Please direct questions and support issues to <bioperl-l@bioperl.org>
6 # Cared for by Hilmar Lapp <hlapp at gmx.net>
8 # Copyright Hilmar Lapp
10 # You may distribute this module under the same terms as perl itself
13 # (c) Hilmar Lapp, hlapp at gmx.net, 2003.
14 # (c) GNF, Genomics Institute of the Novartis Research Foundation, 2003.
16 # You may distribute this module under the same terms as perl itself.
17 # Refer to the Perl Artistic License (see the license accompanying this
18 # software package, or see http://www.perl.com/language/misc/Artistic.html)
19 # for the terms under which you may use, modify, and redistribute this module.
21 # THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
22 # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
23 # MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
26 # POD documentation - main docs before the code
30 Bio::Factory::ObjectFactory - Instantiates a new Bio::Root::RootI (or derived class) through a factory
34 use Bio::Factory::ObjectFactory;
36 my $factory = Bio::Factory::ObjectFactory->new(-type => 'Bio::Ontology::GOterm');
37 my $term = $factory->create_object(-name => 'peroxisome',
38 -ontology => 'Gene Factory',
39 -identifier => 'GO:0005777');
44 This object will build L<Bio::Root::RootI> objects generically.
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.
54 bioperl-l@bioperl.org - General discussion
55 http://bioperl.org/wiki/Mailing_lists - About the mailing lists
59 Please direct usage questions or support issues to the mailing list:
61 I<bioperl-l@bioperl.org>
63 rather than to the module maintainer directly. Many experienced and
64 reponsive experts will be able look at the problem and quickly
65 address it. Please include a thorough description of the problem
66 with code and data examples if at all possible.
70 Report bugs to the Bioperl bug tracking system to help us keep track
71 of the bugs and their resolution. Bug reports can be submitted via the
74 https://github.com/bioperl/bioperl-live/issues
76 =head1 AUTHOR - Hilmar Lapp
78 Email hlapp at gmx.net
83 This is mostly copy-and-paste with subsequent adaptation from
84 Bio::Seq::SeqFactory by Jason Stajich. Most credits should in fact go
89 The rest of the documentation details each of the object methods.
90 Internal methods are usually preceded with a _
95 # Let the code begin...
98 package Bio
::Factory
::ObjectFactory
;
103 use base
qw(Bio::Root::Root Bio::Factory::ObjectFactoryI);
108 Usage : my $obj = Bio::Factory::ObjectFactory->new();
109 Function: Builds a new Bio::Factory::ObjectFactory object
110 Returns : Bio::Factory::ObjectFactory
111 Args : -type => string, name of a L<Bio::Root::RootI> derived class.
113 -interface => string, name of the interface or class any type
114 specified needs to at least implement.
115 The default is Bio::Root::RootI.
120 my($class,@args) = @_;
122 my $self = $class->SUPER::new
(@args);
124 my ($type,$interface) = $self->_rearrange([qw(TYPE INTERFACE)], @args);
126 $self->{'_loaded_types'} = {};
127 $self->interface($interface || "Bio::Root::RootI");
128 $self->type($type) if $type;
136 Title : create_object
137 Usage : my $seq = $factory->create_object(<named parameters>);
138 Function: Instantiates a new object of the previously set type.
140 This object allows us to genericize the instantiation of
143 You must have provided -type at instantiation, or have
144 called type($mytype) before you can call this method.
146 Returns : an object of the type returned by type()
148 The return type is configurable using new(-type =>"..."),
149 or by calling $self->type("My::Fancy::Class").
150 Args : Initialization parameters specific to the type of
151 object we want. Check the POD of the class you set as type.
156 my ($self,@args) = @_;
158 my $type = $self->type(); # type has already been loaded upon set
159 return $type->new(-verbose
=> $self->verbose, @args);
165 Usage : $obj->type($newval)
166 Function: Get/set the type of object to be created.
168 This may be changed at any time during the lifetime of this
171 Returns : value of type (a string)
172 Args : newvalue (optional, a string)
182 if($type && (! $self->{'_loaded_types'}->{$type})) {
184 $self->_load_module($type);
187 $self->throw("module for '$type' failed to load: ".
190 my $o = bless {},$type;
191 if(!$self->_validate_type($o)) { # this may throw an exception
192 $self->throw("'$type' is not valid for factory ".ref($self));
194 $self->{'_loaded_types'}->{$type} = 1;
196 return $self->{'type'} = $type;
198 return $self->{'type'};
204 Usage : $obj->interface($newval)
205 Function: Get/set the interface or base class that supplied types
206 must at least implement (inherit from).
208 Returns : value of interface (a scalar)
209 Args : on set, new value (a scalar or undef, optional)
216 my $interface = shift;
219 return $self->{'interface'} = $interface;
221 return $self->{'interface'};
224 =head2 _validate_type
226 Title : _validate_type
227 Usage : $factory->_validate_type($object)
228 Function: Called to let derived factories validate the type set
231 The default implementation here checks whether the supplied
232 object skeleton implements the interface set via -interface
233 upon factory instantiation.
236 Returns : TRUE if the type is to be considered valid, and FALSE otherwise.
237 Instead of returning FALSE this method may also just throw
238 an informative exception.
240 The default implementation here will throw an exception
241 if the supplied object does not inherit from the interface
242 provided by the interface() method.
244 Args : A hash reference blessed into the specified type, allowing
251 my ($self,$obj) = @_;
253 if(! $obj->isa($self->interface())) {
254 $self->throw("invalid type: '".ref($obj).
255 "' does not implement '".$self->interface()."'");
260 #####################################################################
261 # aliases for naming consistency or other reasons #
262 #####################################################################
264 *create
= \
&create_object
;