From adb31f09315e76965ea5925ff72b5e4b32aa94c0 Mon Sep 17 00:00:00 2001
From: Alex Reisner <alex@alexreisner.com>
Date: Thu, 17 Mar 2011 10:19:18 -0400
Subject: [PATCH] Move Geocoder::Model to separate file.

---
 lib/geocoder.rb         |  1 +
 lib/geocoder/model.rb   | 75 +++++++++++++++++++++++++++++++++++++++++
 lib/geocoder/railtie.rb | 60 ++-------------------------------
 3 files changed, 79 insertions(+), 57 deletions(-)
 create mode 100644 lib/geocoder/model.rb

diff --git a/lib/geocoder.rb b/lib/geocoder.rb
index 4eee5874..d03de3e5 100644
--- a/lib/geocoder.rb
+++ b/lib/geocoder.rb
@@ -1,6 +1,7 @@
 require "geocoder/configuration"
 require "geocoder/calculations"
 require "geocoder/cache"
+require "geocoder/model"
 require "geocoder/request"
 
 module Geocoder
diff --git a/lib/geocoder/model.rb b/lib/geocoder/model.rb
new file mode 100644
index 00000000..d8dcbfee
--- /dev/null
+++ b/lib/geocoder/model.rb
@@ -0,0 +1,75 @@
+require 'geocoder'
+
+module Geocoder
+
+  ##
+  # Methods for invoking Geocoder in a model.
+  #
+  module Model
+    module Base
+
+      ##
+      # Set attribute names and include the Geocoder module.
+      #
+      def geocoded_by(address_attr, options = {}, &block)
+        geocoder_init(
+          :geocode       => true,
+          :user_address  => address_attr,
+          :latitude      => options[:latitude]  || :latitude,
+          :longitude     => options[:longitude] || :longitude,
+          :geocode_block => block
+        )
+      end
+
+      ##
+      # Set attribute names and include the Geocoder module.
+      #
+      def reverse_geocoded_by(latitude_attr, longitude_attr, options = {}, &block)
+        geocoder_init(
+          :reverse_geocode => true,
+          :fetched_address => options[:address] || :address,
+          :latitude        => latitude_attr,
+          :longitude       => longitude_attr,
+          :reverse_block   => block
+        )
+      end
+
+      def geocoder_options
+        @geocoder_options
+      end
+
+      private # ----------------------------------------------------------------
+
+      def geocoder_init(options)
+        unless geocoder_initialized?
+          @geocoder_options = {}
+          require "geocoder/orms/#{geocoder_file_name}"
+          include eval("Geocoder::Orm::" + geocoder_module_name)
+        end
+        @geocoder_options.merge! options
+      end
+
+      def geocoder_initialized?
+        begin
+          included_modules.include? eval("Geocoder::Orm::" + geocoder_module_name)
+        rescue NameError
+          false
+        end
+      end
+    end
+
+    module ActiveRecord
+      include Base
+      private
+      def geocoder_file_name;   "active_record"; end
+      def geocoder_module_name; "ActiveRecord"; end
+    end
+
+    module Mongoid
+      include Base
+      private
+      def geocoder_file_name;   "mongoid"; end
+      def geocoder_module_name; "Mongoid"; end
+    end
+  end
+end
diff --git a/lib/geocoder/railtie.rb b/lib/geocoder/railtie.rb
index 4745c245..62cc2516 100644
--- a/lib/geocoder/railtie.rb
+++ b/lib/geocoder/railtie.rb
@@ -1,4 +1,5 @@
 require 'geocoder'
+require 'geocoder/model'
 
 module Geocoder
   if defined? Rails::Railtie
@@ -17,63 +18,8 @@ module Geocoder
 
   class Railtie
     def self.insert
-      return unless defined?(::ActiveRecord)
-      ::ActiveRecord::Base.extend(ModelMethods)
-    end
-  end
-
-  ##
-  # Methods available in the model class before Geocoder is invoked.
-  #
-  module ModelMethods
-
-    ##
-    # Set attribute names and include the Geocoder module.
-    #
-    def geocoded_by(address_attr, options = {}, &block)
-      geocoder_init(
-        :geocode       => true,
-        :user_address  => address_attr,
-        :latitude      => options[:latitude]  || :latitude,
-        :longitude     => options[:longitude] || :longitude,
-        :geocode_block => block
-      )
-    end
-
-    ##
-    # Set attribute names and include the Geocoder module.
-    #
-    def reverse_geocoded_by(latitude_attr, longitude_attr, options = {}, &block)
-      geocoder_init(
-        :reverse_geocode => true,
-        :fetched_address => options[:address] || :address,
-        :latitude        => latitude_attr,
-        :longitude       => longitude_attr,
-        :reverse_block   => block
-      )
-    end
-
-    def geocoder_options
-      @geocoder_options
-    end
-
-
-    private # ----------------------------------------------------------------
-
-    def geocoder_init(options)
-      unless geocoder_initialized?
-        @geocoder_options = {}
-        require 'geocoder/orms/active_record'
-        include Geocoder::Orm::ActiveRecord
-      end
-      @geocoder_options.merge! options
-    end
-
-    def geocoder_initialized?
-      begin
-        included_modules.include? Geocoder::Orm::ActiveRecord
-      rescue NameError
-        false
+      if defined?(::ActiveRecord)
+        ::ActiveRecord::Base.extend(Model::ActiveRecord)
       end
     end
   end
-- 
GitLab