From 98affdfd33d81d8e9b4c7cea9454d5233047233a Mon Sep 17 00:00:00 2001
From: Alex Reisner <alex@alexreisner.com>
Date: Fri, 4 Mar 2011 18:48:37 -0500
Subject: [PATCH] Clean up Railtie.

Move model class methods to separate module.
---
 lib/geocoder/railtie.rb | 86 ++++++++++++++++++++++-------------------
 1 file changed, 46 insertions(+), 40 deletions(-)

diff --git a/lib/geocoder/railtie.rb b/lib/geocoder/railtie.rb
index 0a15a0ff..4a717eda 100644
--- a/lib/geocoder/railtie.rb
+++ b/lib/geocoder/railtie.rb
@@ -1,5 +1,4 @@
 require 'geocoder'
-require 'geocoder/orms/active_record'
 
 module Geocoder
   if defined? Rails::Railtie
@@ -18,53 +17,60 @@ module Geocoder
 
   class Railtie
     def self.insert
-
       return unless defined?(::ActiveRecord)
+      ::ActiveRecord::Base.extend(ModelMethods)
+    end
+  end
 
-      ##
-      # Add methods to ActiveRecord::Base so Geocoder is accessible by models.
-      #
-      ::ActiveRecord::Base.class_eval do
+  ##
+  # Methods available in the model class before Geocoder is invoked.
+  #
+  module ModelMethods
 
-        ##
-        # Set attribute names and include the Geocoder module.
-        #
-        def self.geocoded_by(address_attr, options = {}, &block)
-          _geocoder_init(
-            :user_address => address_attr,
-            :latitude  => options[:latitude]  || :latitude,
-            :longitude => options[:longitude] || :longitude,
-            :block => block
-          )
-        end
+    ##
+    # Set attribute names and include the Geocoder module.
+    #
+    def geocoded_by(address_attr, options = {}, &block)
+      geocoder_init(
+        :user_address => address_attr,
+        :latitude  => options[:latitude]  || :latitude,
+        :longitude => options[:longitude] || :longitude,
+        :block => block
+      )
+    end
 
-        ##
-        # Set attribute names and include the Geocoder module.
-        #
-        def self.reverse_geocoded_by(latitude_attr, longitude_attr, options = {})
-          _geocoder_init(
-            :fetched_address => options[:address] || :address,
-            :latitude  => latitude_attr,
-            :longitude => longitude_attr
-          )
-        end
+    ##
+    # Set attribute names and include the Geocoder module.
+    #
+    def reverse_geocoded_by(latitude_attr, longitude_attr, options = {})
+      geocoder_init(
+        :fetched_address => options[:address] || :address,
+        :latitude  => latitude_attr,
+        :longitude => longitude_attr
+      )
+    end
 
-        def self._geocoder_init(options)
-          unless _geocoder_initialized?
-            class_inheritable_reader :geocoder_options
-            class_inheritable_hash_writer :geocoder_options
-          end
-          self.geocoder_options = options
-          unless _geocoder_initialized?
-            include Geocoder::Orm::ActiveRecord
-          end
-        end
+    def geocoder_options
+      @geocoder_options
+    end
 
-        def self._geocoder_initialized?
-          included_modules.include? Geocoder::Orm::ActiveRecord
-        end
+
+    private # ----------------------------------------------------------------
+
+    def geocoder_init(options)
+      unless geocoder_initialized?
+        @geocoder_options = options
+        require 'geocoder/orms/active_record'
+        include Geocoder::Orm::ActiveRecord
       end
+    end
 
+    def geocoder_initialized?
+      begin
+        included_modules.include? Geocoder::Orm::ActiveRecord
+      rescue NameError
+        false
+      end
     end
   end
 end
-- 
GitLab