Algorithm-SpatialIndex

 view release on metacpan or  search on metacpan

lib/Algorithm/SpatialIndex/Storage.pm  view on Meta::CPAN

package Algorithm::SpatialIndex::Storage;
use 5.008001;
use strict;
use warnings;
use Carp qw(croak);

require Algorithm::SpatialIndex::Strategy;
use Scalar::Util 'weaken';

use Class::XSAccessor {
  getters => [qw(
    index
    no_of_subnodes
    bucket_class
  )],
};

sub new {
  my $class = shift;
  my %opt = @_;
  my $ext_opt = $opt{opt}||{};

  my $self = bless {
    bucket_class => defined($ext_opt->{bucket_class}) ? $ext_opt->{bucket_class} : 'Algorithm::SpatialIndex::Bucket',
    %opt,
  } => $class;

  weaken($self->{index});

  my $bucket_class = $self->bucket_class;
  if (not $bucket_class =~ /::/) {
    $bucket_class = "Algorithm::SpatialIndex::Bucket::$bucket_class";
    $self->{bucket_class} = $bucket_class;
  }

  eval "require $bucket_class; 1;" or do {
    my $err = $@ || "Zombie error";
    die "Could not load bucket implementation '$bucket_class': $err"
  };

  my $strategy = $self->index->strategy;
  $self->{no_of_subnodes} = $strategy->no_of_subnodes;

  $self->init() if $self->can('init');

  return $self;
}

sub fetch_node {
  croak("Not implemented in base class");
}

sub store_node {
  croak("Not implemented in base class");
}

sub fetch_bucket {
  croak("Not implemented in base class");
}

sub delete_bucket {
  croak("Not implemented in base class");
}

sub store_bucket {
  croak("Not implemented in base class");
}

sub get_option {
  croak("Not implemented in base class");
}

sub set_option {
  croak("Not implemented in base class");
}

1;
__END__

=head1 NAME

Algorithm::SpatialIndex::Storage - Base class for storage backends

=head1 SYNOPSIS

  use Algorithm::SpatialIndex;
  my $idx = Algorithm::SpatialIndex->new(
    storage => 'Memory', # or others
  );

=head1 DESCRIPTION

=head1 METHODS

=head2 new

Constructor. Called by the L<Algorithm::SpatialIndex>



( run in 1.131 second using v1.01-cache-2.11-cpan-119454b85a5 )