Michael Rogoff | 6 Feb 01:54 2013

Bio::Graphics error when rendering features with Split locations

When trying to render features from a genbank file that include a split location e.g.:

     promoter        join(1000..1080,1..5)
                     /label=PROM1

The following exception is raised:
Can't locate object method "has_tag" via package "Bio::Location::Simple" at
lib/perl5/site_perl/5.10.1/Bio/Graphics/Glyph.pm line 704, <GEN0> line 36.

This can be reproduced with the code in the example "Rendering Features from a GenBank or EMBL File" from the
Graphics HOW-TO:
http://www.bioperl.org/wiki/HOWTO:Graphics#Rendering_Features_from_a_GenBank_or_EMBL_File

Is there a way to change the script so that split locations would, at the very least, not cause a fatal error? 
Is there a different glyph type that needs to be used?  Thanks in advance for any help.

I've attached a simple genbank input that will reproduce the error:

LOCUS       sample2     1080 bp DNA    circular
DEFINITION  Cloning vector sample2
ACCESSION   sample2
VERSION     sample2.1  GI:4352432
COMMENT     Component Fragments
FEATURES               Location/Qualifiers
     terminator      39..328
                     /label=TERM1
                     /note="terminator 1"
     misc_feature    393..488
                     /label=MF1
     CDS             complement(800..900)
                     /label=CDS1
                     /note="resistence gene"
     promoter        join(1000..1080,1..5)
                     /label=PROM1
ORIGIN
        1  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
       61  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      121  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      181  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      241  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      301  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      361  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      421  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      481  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      541  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      601  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      661  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      721  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      781  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      841  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      901  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
      961  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
     1021  nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn nnnnnnnnnn
//

P.S.  I think I have traced the source of the problem to Glyph's _subfeat method, which in the case of a feature
with split locations is returning location objects instead of feature objects.  Is this a bug?

sub _subfeat {
  my $class   = shift;
  my $feature = shift;

  return $feature->segments     if $feature->can('segments');

  my  <at> split = eval { my $id   = $feature->location->seq_id;
                     my  <at> subs = $feature->location->sub_Location;
                     grep {$id eq $_->seq_id}  <at> subs;
                   };

  return  <at> split if  <at> split;

  # Either the APIs have changed, or I got confused at some point...
  return $feature->get_SeqFeatures         if $feature->can('get_SeqFeatures');
  return $feature->sub_SeqFeature          if $feature->can('sub_SeqFeature');
  return;
}

Gmane