Geo::Coder::Cache - Add cache for Geo::Coder::*


Geo-Coder-Cache documentation Contained in the Geo-Coder-Cache distribution.

Index


Code Index:

NAME

Top

Geo::Coder::Cache - Add cache for Geo::Coder::*

SYNOPSIS

Top

  # for Geo::Coder::Yahoo
  use Geo::Coder::Yahoo;
  use Geo::Coder::Cache;
  my $geocoder = Geo::Coder::Cache->new(geocoder => Geo::Coder::Yahoo->new(appid => 'Your App ID'));
  my $location = $geocoder->geocode(location => '701 1st Ave, Sunnyvale, CA 94089');

  # for Geo::Coder::Google
  use Geo::Coder::Google;
  use Geo::Coder::Cache;
  my $geocoder = Geo::Coder::Cache->new(geocoder => Geo::Coder::Google->new(apikey => 'Your API Key'));
  my $location = $geocoder->geocode(location => '1600 Amphitheatre Pkwy, Mountain View, CA 94043');

DESCRIPTION

Top

Geo::Coder::Cache is a Geo::Coder::* wrapper with local file cache implemented by Cache::FileCache.

METHOD

Top

new

This method constructs a new Geo::Coder::Cache object and returns it. geocoder is required, and all the other options will be passed to Cache::FileCache.

  KEY                     DEFAULT
  -----------             --------------------
  geocoder                REQUIRED
  namespace               geo-coder-cache
  cache_root              $HOME/.cache
  default_expires_in      86400

get
set
remove

Geo::Coder::Cache itself is a Cache::FileCache, so please check Cache::FileCahce for cache related methods.

geocode

It is the primary method of this class. It will retrive result from cache first, and return if cache hit. Otherwise it will call Geo::Coder::*->geocode and then save the result in cache.

SEE ALSO

Top

Cache::FileCache

AUTHOR

Top

Yen-Ming Lee, <leeym@leeym.com>

COPYRIGHT AND LICENSE

Top


Geo-Coder-Cache documentation Contained in the Geo-Coder-Cache distribution.

package Geo::Coder::Cache;
use base 'Cache::FileCache';
use strict;

use vars qw($VERSION $AUTOLOAD);

$VERSION = '0.05';

our $HOME = $ENV{'HOME'} || $ENV{'LOGDIR'};
our %default_cache_args = (
    'namespace' => 'geo-coder-cache',
    'cache_root' => "$HOME/.cache",
    'default_expires_in' => 86400);

sub new {
  my($class, %param) = @_;
  my $geocoder = delete $param{geocoder} or Carp::croak("Usage: new(geocoder => \$geocoder)");
  ($default_cache_args{namespace} .= '-' . lc ref($geocoder)) =~ s{::}{-}g;
  my %cache_args = (%default_cache_args, %param);
  my $self = $class->SUPER::new(\%cache_args);
  $self->{geocoder} = $geocoder;
  return $self;
}

# delegate all other method calls the the cache object.
sub AUTOLOAD
{
    my $method = substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2);

    # We create the function here so that it will not need to be
    # autoloaded the next time.
    no strict 'refs';
    *$method = sub {
      my $self = shift;
      $self->{'geocoder'}->$method(@_);
    };
    goto &$method;
}

sub DESTROY {}  # avoid AUTOLOADing it

sub geocode {
  my $self = shift;
  my %param;
  if (@_ % 2 == 0) {
    %param = @_;
  } else {
    $param{location} = shift;
  }
  if ($param{location}) {
    my $location = $self->get($param{location});
    if (defined($location)) {
      return $location;
    }
  }
  my $location = $self->{geocoder}->geocode(%param);
  $self->set($param{location}, $location);
  return $location;
}

1;
__END__