| Bio-Phylo documentation | Contained in the Bio-Phylo distribution. |
Bio::Phylo::Factory - Creator of objects, reduces hardcoded class names in code
use Bio::Phylo::Factory; my $fac = Bio::Phylo::Factory->new; my $node = $fac->create_node( '-name' => 'node1' ); # probably prints 'Bio::Phylo::Forest::Node'? print ref $node;
The factory module is used to create other objects without having to 'use' their classes. This allows for greater flexibility in Bio::Phylo's design, as class names are no longer hard-coded all over the place.
Factory constructor.
Type : Constructor
Title : new
Usage : my $fac = Bio::Phylo::Factory->new;
Function: Initializes a Bio::Phylo::Factory object.
Returns : A Bio::Phylo::Factory object.
Args : (optional) a hash keyed on short names, with
class names for values. For example,
'node' => 'Bio::Phylo::Forest::Node', which
will allow you to subsequently call $fac->create_node,
which will return a Bio::Phylo::Forest::Node object.
(Note that this example is enabled by default, so you
don't need to specify it.)
Type : Factory methods
Title : create
Usage : my $foo = $fac->create('Foo::Class');
Function: Creates an instance of $class, with constructor arguments %args
Returns : A Bio::Phylo::* object.
Args : $class, a class name (required),
%args, constructor arguments (optional)
Registers the argument class name such that subsequently the factory can instantiates objects of that class. For example, if you register Foo::Bar, the factory will be able to instantiate objects through the create_bar() method.
Type : Factory methods
Title : register_class
Usage : $fac->register_class('Foo::Bar');
Function: Registers a class name for instantiation
Returns : Invocant
Args : $class, a class name (required), or
'bar' => 'Foo::Bar', such that you
can subsequently call $fac->create_bar()
Also see the manual: Bio::Phylo::Manual and http://rutgervos.blogspot.com.
If you use Bio::Phylo in published research, please cite it:
Rutger A Vos, Jason Caravas, Klaas Hartmann, Mark A Jensen and Chase Miller, 2011. Bio::Phylo - phyloinformatic analysis using Perl. BMC Bioinformatics 12:63. http://dx.doi.org/10.1186/1471-2105-12-63
$Id: Factory.pm 1660 2011-04-02 18:29:40Z rvos $
| Bio-Phylo documentation | Contained in the Bio-Phylo distribution. |
package Bio::Phylo::Factory; use strict; use Bio::Phylo::Util::Exceptions 'throw'; use Bio::Phylo::Util::CONSTANT qw'looks_like_hash looks_like_class'; our $AUTOLOAD; my %class = ( 'taxa' => 'Bio::Phylo::Taxa', 'taxon' => 'Bio::Phylo::Taxa::Taxon', 'datum' => 'Bio::Phylo::Matrices::Datum', 'matrix' => 'Bio::Phylo::Matrices::Matrix', 'characters' => 'Bio::Phylo::Matrices::Characters', 'character' => 'Bio::Phylo::Matrices::Character', 'forest' => 'Bio::Phylo::Forest', 'node' => 'Bio::Phylo::Forest::Node', 'tree' => 'Bio::Phylo::Forest::Tree', 'logger' => 'Bio::Phylo::Util::Logger', 'drawer' => 'Bio::Phylo::Treedrawer', 'treedrawer' => 'Bio::Phylo::Treedrawer', 'project' => 'Bio::Phylo::Project', 'annotation' => 'Bio::Phylo::Annotation', 'set' => 'Bio::Phylo::Set', 'generator' => 'Bio::Phylo::Generator', 'xmlwritable' => 'Bio::Phylo::NeXML::Writable', 'xmlliteral' => 'Bio::Phylo::NeXML::Meta::XMLLiteral', 'meta' => 'Bio::Phylo::NeXML::Meta', 'dom' => 'Bio::Phylo::NeXML::DOM', 'document' => 'Bio::Phylo::NeXML::DOM::Document', 'element' => 'Bio::Phylo::NeXML::DOM::Element', # 'client' => 'Bio::Phylo::PhyloWS::Client', # 'server' => 'Bio::Phylo::PhyloWS::Server', # 'resource' => 'Bio::Phylo::PhyloWS::Resource', # 'description' => 'Bio::Phylo::PhyloWS::Resource::Description', );
sub new { my $class = shift; if (@_) { my %args = looks_like_hash @_; while ( my ( $key, $value ) = each %args ) { if ( looks_like_class $value ) { $class{$key} = $value; } } } bless \$class, $class; }
sub create { my $self = shift; my $class = shift; if ( looks_like_class $class ) { return $class->new(@_); } }
sub register_class { my ( $self, @args ) = @_; my ( $short, $class ); if ( @args == 1 ) { $class = $args[0]; } else { ( $short, $class ) = @args; } my $path = $class; $path =~ s|::|/|g; $path .= '.pm'; if ( not $INC{$path} ) { eval { require $path }; if ($@) { throw 'ExtensionError' => "Can't register $class - $@"; } } if ( not defined $short ) { $short = $class; $short =~ s/.*://; $short = lc $short; } $class{$short} = $class; return $self; } sub AUTOLOAD { my $self = shift; my $method = $AUTOLOAD; $method =~ s/.*://; my $type = $method; $type =~ s/^create_//; if ( exists $class{$type} ) { my $class = $class{$type}; my $path = $class; $path =~ s|::|/|g; $path .= '.pm'; if ( not $INC{$path} ) { require $path; } return $class{$type}->new(@_); } elsif ( $method =~ qr/^[A-Z]+$/ ) { return; } else { throw 'UnknownMethod' => "No such method: $method"; } }
1;