From 4af14839f3dfe45b39ff7433ea39b1a287a879b2 Mon Sep 17 00:00:00 2001
From: Ilya Shtricul <shtricul@users.noreply.github.com>
Date: Tue, 22 Dec 2015 08:57:09 +0300
Subject: [PATCH 1/8] Update version of geocoder

---
 composer.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index d959567..798768a 100644
--- a/composer.json
+++ b/composer.json
@@ -15,7 +15,7 @@
     "require" : {
         "php"                 : ">=5.4",
         "illuminate/support"  : "~5.0",
-        "willdurand/geocoder" : "~2.4"
+        "willdurand/geocoder" : "~3.0"
     },
 
     "require-dev" : {

From 2ac108c78472b072d3e67fa0040059bc21fea9b5 Mon Sep 17 00:00:00 2001
From: Ilya Shtricul <shtricul@users.noreply.github.com>
Date: Tue, 22 Dec 2015 09:28:20 +0300
Subject: [PATCH 2/8] Register all providers

Not only chain provider registration
---
 src/GeocoderServiceProvider.php | 32 +++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/src/GeocoderServiceProvider.php b/src/GeocoderServiceProvider.php
index b843f4f..22d4d93 100644
--- a/src/GeocoderServiceProvider.php
+++ b/src/GeocoderServiceProvider.php
@@ -71,7 +71,9 @@ function ($arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null) use ($app, $pr
 
         $this->app['geocoder'] = $this->app->share(function($app) {
             $geocoder = new Geocoder;
-            $geocoder->registerProvider($app['geocoder.chain']);
+            $geocoder->registerProviders(
+                $this->getGeocoderProviders($this->app['config']->get('geocoder.providers'))
+            );
 
             return $geocoder;
         });
@@ -86,4 +88,32 @@ public function provides()
     {
         return ['geocoder', 'geocoder.adapter', 'geocoder.chain'];
     }
+    
+    protected function getGeocoderProviders(array $providersConfig)
+    {
+        $providers = [];
+
+        foreach($providersConfig as $provider => $arguments) {
+            //Chain provider
+            if(is_int($provider)){
+                $chainProviders = $this->getGeocoderProviders($arguments);
+                $providers[] = new ChainProvider($chainProviders);
+            }else {
+                if (0 !== count($arguments)) {
+                    $providers[] = call_user_func_array(
+                        function ($arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null) use ($provider) {
+                            return new $provider($this->app['geocoder.adapter'], $arg1, $arg2, $arg3, $arg4);
+                        },
+                        $arguments
+                    );
+
+                    continue;
+                }
+
+                $providers[] = new $provider($this->app['geocoder.adapter']);
+            }
+        }
+
+        return $providers;
+    }
 }

From 3e62b600e8ed928727f6b065c85229562ebad2f7 Mon Sep 17 00:00:00 2001
From: Ilya Shtricul <shtricul@users.noreply.github.com>
Date: Tue, 22 Dec 2015 09:29:26 +0300
Subject: [PATCH 3/8] Deleted chain provider singleton

---
 src/GeocoderServiceProvider.php | 21 ---------------------
 1 file changed, 21 deletions(-)

diff --git a/src/GeocoderServiceProvider.php b/src/GeocoderServiceProvider.php
index 22d4d93..ec822ec 100644
--- a/src/GeocoderServiceProvider.php
+++ b/src/GeocoderServiceProvider.php
@@ -48,27 +48,6 @@ public function register()
             return new $adapter;
         });
 
-        $this->app->singleton('geocoder.chain', function($app) {
-            $providers = [];
-
-            foreach($app['config']->get('geocoder.providers') as $provider => $arguments) {
-                if (0 !== count($arguments)) {
-                    $providers[] = call_user_func_array(
-                        function ($arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null) use ($app, $provider) {
-                            return new $provider($app['geocoder.adapter'], $arg1, $arg2, $arg3, $arg4);
-                        },
-                        $arguments
-                    );
-
-                    continue;
-                }
-
-                $providers[] = new $provider($app['geocoder.adapter']);
-            }
-
-            return new ChainProvider($providers);
-        });
-
         $this->app['geocoder'] = $this->app->share(function($app) {
             $geocoder = new Geocoder;
             $geocoder->registerProviders(

From f1bd05b20c9f69192c532f38cf79f25e36d82355 Mon Sep 17 00:00:00 2001
From: Ilya Shtricul <shtricul@users.noreply.github.com>
Date: Tue, 22 Dec 2015 10:16:24 +0300
Subject: [PATCH 4/8] Fix namespaces for Geocoder v3

---
 src/GeocoderServiceProvider.php | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/GeocoderServiceProvider.php b/src/GeocoderServiceProvider.php
index ec822ec..cf74d87 100644
--- a/src/GeocoderServiceProvider.php
+++ b/src/GeocoderServiceProvider.php
@@ -11,8 +11,8 @@
 
 namespace Toin0u\Geocoder;
 
-use Geocoder\Geocoder;
-use Geocoder\Provider\ChainProvider;
+use Geocoder\ProviderAggregator;
+use Geocoder\Provider\Chain;
 
 /**
  * Geocoder service provider
@@ -49,7 +49,7 @@ public function register()
         });
 
         $this->app['geocoder'] = $this->app->share(function($app) {
-            $geocoder = new Geocoder;
+            $geocoder = new ProviderAggregator;
             $geocoder->registerProviders(
                 $this->getGeocoderProviders($this->app['config']->get('geocoder.providers'))
             );
@@ -65,7 +65,7 @@ public function register()
      */
     public function provides()
     {
-        return ['geocoder', 'geocoder.adapter', 'geocoder.chain'];
+        return ['geocoder', 'geocoder.adapter'];
     }
     
     protected function getGeocoderProviders(array $providersConfig)
@@ -76,7 +76,7 @@ protected function getGeocoderProviders(array $providersConfig)
             //Chain provider
             if(is_int($provider)){
                 $chainProviders = $this->getGeocoderProviders($arguments);
-                $providers[] = new ChainProvider($chainProviders);
+                $providers[] = new Chain($chainProviders);
             }else {
                 if (0 !== count($arguments)) {
                     $providers[] = call_user_func_array(

From 3a7841dd6f32b561c459ab72836a61855c6c619e Mon Sep 17 00:00:00 2001
From: Ilya Shtricul <shtricul@users.noreply.github.com>
Date: Tue, 22 Dec 2015 10:19:35 +0300
Subject: [PATCH 5/8] Fix namespaces for Geocoder v3

---
 config/geocoder.php | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/config/geocoder.php b/config/geocoder.php
index 61624ea..c77a084 100644
--- a/config/geocoder.php
+++ b/config/geocoder.php
@@ -13,8 +13,14 @@
     // Providers get called in the chain order given here.
     // The first one to return a result will be used.
     'providers' => [
-        'Geocoder\Provider\GoogleMapsProvider' => ['fr-FR', 'Île-de-France', true],
-        'Geocoder\Provider\FreeGeoIpProvider'  => null,
+        // Named Providers
+        Geocoder\Provider\GoogleMaps::class => ['fr-FR', 'Île-de-France', true],
+        Geocoder\Provider\FreeGeoIp::class  => null,
+        // Chain Provider
+        [
+            Geocoder\Provider\GoogleMaps::class => ['fr-FR', 'Île-de-France', true],
+            Geocoder\Provider\FreeGeoIp::class  => null,
+        ]
     ],
-    'adapter'  => 'Geocoder\HttpAdapter\CurlHttpAdapter',
+    'adapter'  => Ivory\HttpAdapter\CurlHttpAdapter::class,
 ];

From 5fa2ae32c8334ad6082704fa4d82ad4fd9629d18 Mon Sep 17 00:00:00 2001
From: Ilya Shtricul <shtricul@users.noreply.github.com>
Date: Tue, 22 Dec 2015 14:19:36 +0300
Subject: [PATCH 6/8] run test

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 2cbd33a..d06a967 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 Geocoder for Lavarel 5
 ======================
 
-If you still use **Lavarel 4**, please check out the `0.4.x` branch [here](https://github.com/geocoder-php/GeocoderLaravel/tree/0.4.x).
+If you still use **Lavarel 4**, please check out the `0.4.x` branch [here](https://github.com/geocoder-php/GeocoderLaravel/tree/0.4.x)..
 
 This package allows you to use [**Geocoder**](http://geocoder-php.org/Geocoder/)
 in [**Laravel 5**](http://laravel.com/).

From d93d903a7d0be46cc206c01a0210c149bbbe40dc Mon Sep 17 00:00:00 2001
From: Ilya Shtricul <shtricul@gmail.com>
Date: Tue, 22 Dec 2015 15:00:20 +0300
Subject: [PATCH 7/8] Fixed tests

---
 tests/Facade/GeocoderTest.php         |  2 +-
 tests/GeocoderServiceProviderTest.php | 41 ++++++++++++++++++---------
 2 files changed, 28 insertions(+), 15 deletions(-)

diff --git a/tests/Facade/GeocoderTest.php b/tests/Facade/GeocoderTest.php
index 079e650..534b9cf 100644
--- a/tests/Facade/GeocoderTest.php
+++ b/tests/Facade/GeocoderTest.php
@@ -20,6 +20,6 @@ public function testGeocoderFacade()
     {
         $this->assertTrue(is_array($providers = \Geocoder::getProviders()));
         $this->assertArrayHasKey('chain', $providers);
-        $this->assertInstanceOf('Geocoder\\Provider\\ChainProvider', $providers['chain']);
+        $this->assertInstanceOf('Geocoder\\Provider\\Chain', $providers['chain']);
     }
 }
diff --git a/tests/GeocoderServiceProviderTest.php b/tests/GeocoderServiceProviderTest.php
index 57c9d45..d59864e 100644
--- a/tests/GeocoderServiceProviderTest.php
+++ b/tests/GeocoderServiceProviderTest.php
@@ -19,10 +19,10 @@ class GeocoderServiceProviderTest extends TestCase
     public function testConfig()
     {
         $this->assertTrue(is_array($providers = $this->app['config']->get('geocoder.providers')));
-        $this->assertCount(2, $providers);
-        $this->assertArrayHasKey('Geocoder\\Provider\\GoogleMapsProvider', $providers);
-        $this->assertArrayHasKey('Geocoder\\Provider\\FreeGeoIpProvider', $providers);
-        $this->assertSame('Geocoder\\HttpAdapter\\CurlHttpAdapter', $this->app['config']->get('geocoder.adapter'));
+        $this->assertCount(3, $providers);
+        $this->assertArrayHasKey('Geocoder\\Provider\\GoogleMaps', $providers);
+        $this->assertArrayHasKey('Geocoder\\Provider\\FreeGeoIp', $providers);
+        $this->assertSame('Ivory\\HttpAdapter\\CurlHttpAdapter', $this->app['config']->get('geocoder.adapter'));
     }
 
     public function testLoadedProviders()
@@ -35,25 +35,38 @@ public function testLoadedProviders()
 
     public function testGeocoderDefaultAdapter()
     {
-        $this->assertInstanceOf('Geocoder\\HttpAdapter\\CurlHttpAdapter', $this->app['geocoder.adapter']);
+        $this->assertInstanceOf('Ivory\\HttpAdapter\\CurlHttpAdapter', $this->app['geocoder.adapter']);
     }
 
     public function testGeocoderChainProvider()
     {
-        $this->assertInstanceOf('Geocoder\\Provider\\ChainProvider', $this->app['geocoder.chain']);
+        $providers = $this->getProtectedProperty($this->app['geocoder'], 'providers');
+
+        $this->assertArrayHasKey('chain', $providers);
+
+        $this->assertInstanceOf('Geocoder\\Provider\\Chain', $providers['chain']);
+
+        $chainProviders = $this->getProtectedProperty($providers['chain'], 'providers');
+
+        $this->assertInstanceOf('Geocoder\\Provider\\GoogleMaps', $chainProviders[0]);
+        $this->assertSame('fr-FR', $chainProviders[0]->getLocale());
+        $this->assertInstanceOf('Ivory\\HttpAdapter\\CurlHttpAdapter', $chainProviders[0]->getAdapter());
+
+        $this->assertInstanceOf('Geocoder\\Provider\\FreeGeoIp', $chainProviders[1]);
+        $this->assertInstanceOf('Ivory\\HttpAdapter\\CurlHttpAdapter', $chainProviders[1]->getAdapter());
+
     }
 
-    public function testGeocoderDefaultProvider()
+    public function testGeocoderNamedProviders()
     {
-        $providers = $this->getProtectedProperty($this->app['geocoder.chain'], 'providers');
+        $providers = $this->getProtectedProperty($this->app['geocoder'], 'providers');
 
-        $this->assertInstanceOf('Geocoder\\Provider\\GoogleMapsProvider', $providers[0]);
-        $this->assertSame('fr-FR', $providers[0]->getLocale());
-        $this->assertInstanceOf('Geocoder\\HttpAdapter\\CurlHttpAdapter', $providers[0]->getAdapter());
+        $this->assertInstanceOf('Geocoder\\Provider\\GoogleMaps', $providers['google_maps']);
+        $this->assertSame('fr-FR', $providers['google_maps']->getLocale());
+        $this->assertInstanceOf('Ivory\\HttpAdapter\\CurlHttpAdapter', $providers['google_maps']->getAdapter());
 
-        $this->assertInstanceOf('Geocoder\\Provider\\FreeGeoIpProvider', $providers[1]);
-        $this->assertNull($providers[1]->getLocale());
-        $this->assertInstanceOf('Geocoder\\HttpAdapter\\CurlHttpAdapter', $providers[1]->getAdapter());
+        $this->assertInstanceOf('Geocoder\\Provider\\FreeGeoIp', $providers['free_geo_ip']);
+        $this->assertInstanceOf('Ivory\\HttpAdapter\\CurlHttpAdapter', $providers['free_geo_ip']->getAdapter());
     }
 
     public function testGeocoder()

From dc4cba5fc8ca346c3c57165cd42b42be8218e716 Mon Sep 17 00:00:00 2001
From: Ilya Shtricul <shtricul@gmail.com>
Date: Tue, 22 Dec 2015 15:04:59 +0300
Subject: [PATCH 8/8] Added PHP 5.4 support

---
 config/geocoder.php | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/config/geocoder.php b/config/geocoder.php
index c77a084..37a5178 100644
--- a/config/geocoder.php
+++ b/config/geocoder.php
@@ -14,13 +14,13 @@
     // The first one to return a result will be used.
     'providers' => [
         // Named Providers
-        Geocoder\Provider\GoogleMaps::class => ['fr-FR', 'Île-de-France', true],
-        Geocoder\Provider\FreeGeoIp::class  => null,
+        'Geocoder\Provider\GoogleMaps' => ['fr-FR', 'Île-de-France', true],
+        'Geocoder\Provider\FreeGeoIp'  => null,
         // Chain Provider
         [
-            Geocoder\Provider\GoogleMaps::class => ['fr-FR', 'Île-de-France', true],
-            Geocoder\Provider\FreeGeoIp::class  => null,
+            'Geocoder\Provider\GoogleMaps' => ['fr-FR', 'Île-de-France', true],
+            'Geocoder\Provider\FreeGeoIp'  => null,
         ]
     ],
-    'adapter'  => Ivory\HttpAdapter\CurlHttpAdapter::class,
+    'adapter'  => 'Ivory\HttpAdapter\CurlHttpAdapter',
 ];