<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">=head1 NAME

Script::FlatFileToJson::FeatureStream::GFF3_LowLevel - feature stream
class for working with L&lt;Bio::GFF3::LowLevel::Parser&gt; features

=cut

package Bio::JBrowse::FeatureStream::GFF3_LowLevel;
use strict;
use warnings;

use base 'Bio::JBrowse::FeatureStream';

sub next_items {
    my ( $self ) = @_;
    while ( my $items = $self-&gt;{parser}-&gt;next_item ) {
        if( ref $items eq 'ARRAY' ) {
            return map $self-&gt;_to_hashref( $_ ), @$items;
        }
    }
    return;
}

#use Carp::Always;

sub _to_hashref {
    my ( $self, $f ) = @_;
    # use Data::Dump 'dump';
    # if( ref $f ne 'HASH' ) {
    #     Carp::confess( dump $f );
    # }
    $f-&gt;{score} += 0 if defined $f-&gt;{score};
    $f-&gt;{phase} += 0 if defined $f-&gt;{phase};

    my $a = delete $f-&gt;{attributes};
    my %h;
    for my $key ( sort keys %$f) {
        my $lck = lc $key;
        my $v = $f-&gt;{$key};
        if( defined $v &amp;&amp; ( ref($v) ne 'ARRAY' || @$v ) ) {
            unshift @{ $h{ $lck } ||= [] }, $v;
        }
    }
    # rename child_features to subfeatures
    if( $h{child_features} ) {
        $h{subfeatures} = [
            map {
                [ map $self-&gt;_to_hashref( $_ ), map @$_, @$_ ]
            } @{delete $h{child_features}}
        ];
    }
    if( $h{derived_features} ) {
        $h{derived_features} = [
            map {
                [ map $self-&gt;_to_hashref( $_ ), map @$_, @$_ ]
            } @{$h{derived_features}}
        ];
    }

    my %skip_attributes = ( Parent =&gt; 1 );
    for my $key ( sort keys %{ $a || {} } ) {
        my $lck = lc $key;
        if( !$skip_attributes{$key} ) {
            push @{ $h{$lck} ||= [] }, @{$a-&gt;{$key}};
        }
    }

    my $flat = $self-&gt;_flatten_multivalues( \%h );
    return $flat;
}



1;
</pre></body></html>