aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/Geocode.pm
diff options
context:
space:
mode:
authorMatthew Somerville <matthew-github@dracos.co.uk>2019-05-21 16:28:31 +0100
committerMatthew Somerville <matthew@mysociety.org>2019-09-19 16:11:09 +0100
commitc78ddc808b6d48188d7057c35718bed7f1fc28ff (patch)
treebbbaa67296737fec1946f6f8f3c79e34f9a38728 /perllib/FixMyStreet/Geocode.pm
parentcc2ca7a697e1750ef197e222a1d45c4b345e61d4 (diff)
Switch geocoders to be pluggable.
Diffstat (limited to 'perllib/FixMyStreet/Geocode.pm')
-rw-r--r--perllib/FixMyStreet/Geocode.pm25
1 files changed, 15 insertions, 10 deletions
diff --git a/perllib/FixMyStreet/Geocode.pm b/perllib/FixMyStreet/Geocode.pm
index d552afaa5..61c968269 100644
--- a/perllib/FixMyStreet/Geocode.pm
+++ b/perllib/FixMyStreet/Geocode.pm
@@ -13,12 +13,14 @@ use JSON::MaybeXS;
use LWP::Simple qw($ua);
use Path::Tiny;
use URI::Escape;
-use FixMyStreet::Geocode::Bing;
-use FixMyStreet::Geocode::Google;
-use FixMyStreet::Geocode::OSM;
-use FixMyStreet::Geocode::Zurich;
use Utils;
+use Module::Pluggable
+ sub_name => 'geocoders',
+ search_path => __PACKAGE__,
+ require => 1,
+ except => qr/Address/;
+
# lookup STRING CONTEXT
# Given a user-inputted string, try and convert it into co-ordinates using either
# MaPit if it's a postcode, or some web API otherwise. Returns an array of
@@ -44,14 +46,17 @@ sub lookup {
sub string {
my ($s, $c) = @_;
- my $service = $c->cobrand->get_geocoder($c);
+ my $service = $c->cobrand->get_geocoder();
$service = $service->{type} if ref $service;
- $service = 'OSM' unless $service =~ /^(Bing|Google|OSM|Zurich)$/;
- $service = 'OSM' if $service eq 'Bing' && !FixMyStreet->config('BING_MAPS_API_KEY');
- $service = "FixMyStreet::Geocode::${service}::string";
- no strict 'refs';
- return &$service($s, $c);
+ $service = __PACKAGE__ . '::' . $service;
+ my %avail = map { $_ => 1 } __PACKAGE__->geocoders;
+
+ if (!$avail{$service} || ($service->can('setup') && !$service->setup)) {
+ $service = __PACKAGE__ . '::OSM';
+ }
+
+ return $service->string($s, $c);
}
# escape STRING CONTEXT