--- /dev/null
+package Tabix;
+
+use strict;
+use warnings;
+use Carp qw/croak/;
+
+use TabixIterator;
+
+require Exporter;
+
+our @ISA = qw/Exporter/;
+our @EXPORT = qw/tabix_open tabix_close tabix_read tabix_query tabix_getnames tabix_iter_free/;
+
+our $VERSION = '0.2.0';
+
+require XSLoader;
+XSLoader::load('Tabix', $VERSION);
+
+sub new {
+ my $invocant = shift;
+ my %args = @_;
+ $args{-data} || croak("-data argument required");
+ my $class = ref($invocant) || $invocant;
+ my $self = {};
+ bless($self, $class);
+ $self->open($args{-data}, $args{-index});
+ return $self;
+}
+
+sub open {
+ my ($self, $fn, $fnidx) = @_;
+ $self->close;
+ $self->{_fn} = $fn;
+ $self->{_fnidx} = $fnidx;
+ $self->{_} = $fnidx? tabix_open($fn, $fnidx) : tabix_open($fn);
+}
+
+sub close {
+ my $self = shift;
+ if ($self->{_}) {
+ tabix_close($self->{_});
+ delete($self->{_}); delete($self->{_fn}); delete($self->{_fnidx});
+ }
+}
+
+sub DESTROY {
+ my $self = shift;
+ $self->close;
+}
+
+sub query {
+ my $self = shift;
+ my $iter;
+ if (@_) {
+ $iter = tabix_query($self->{_}, @_);
+ } else {
+ $iter = tabix_query($self->{_});
+ }
+ my $i = TabixIterator->new;
+ $i->set($iter);
+ return $i;
+}
+
+sub read {
+ my $self = shift;
+ my $iter = shift;
+ return tabix_read($self->{_}, $iter->get);
+}
+
+sub getnames {
+ my $self = shift;
+ return tabix_getnames($self->{_});
+}
+
+1;
+__END__