=head1 NAME - Sanger::Graphics::Root =head1 SYNOPSIS use base qw( Sanger::Graphics::Root ); =head1 DESCRIPTION You shouldn't create a Sanger::Graphics::Root object, but should inherit it in other modules - it is really just a container for support functions. =head1 CONTACT Post questions to the EnsEMBL developer mailing list: <ensembl-dev@ebi.ac.uk> =head1 APPENDIX The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _ =cut package Sanger::Graphics::Root; use strict; use warnings; no warnings 'uninitialized'; use Data::Dumper; =head2 new Arg [1] : string $classname The name of the class to "use" Example : $myobject->dynamic_use( 'Sanger::Graphics::GlyphSet::das' ); Description: Requires, and imports the methods for the classname provided, checks the symbol table so that it doesn't re-require modules that have already been required. Returntype : Integer - 1 if successful, 0 if failure Exceptions : Warns to standard error if module fails to compile Caller : general =cut sub dynamic_use { my( $self, $classname ) = @_; if( $self->{'failed_tracks'}{$classname} ) { warn "Sanger Graphics Root: tried to use $classname again - this has already failed"; return 0; } my( $parent_namespace, $module ) = $classname =~/^(.*::)(.*)$/ ? ($1,$2) : ('::',$classname); no strict 'refs'; return 1 if $parent_namespace->{$module.'::'}; # return if already used eval "require $classname"; if($@) { warn "Sanger Graphics Root: failed to use $classname\nSanger Graphics Root: $@"; delete( $parent_namespace->{$module.'::'} ); $self->{'failed_tracks'}{$classname} = 1; return 0; } $classname->import(); return 1; } sub datadump { my $self = shift; my $i=0; warn Data::Dumper::Dumper( @_ ? [@_] : $self ); while( my @Q = caller(++$i) ) { warn " at $Q[3] (file $Q[1] line $Q[2])\n"; } } 1;