module Addresses
  module ClassMethods
    def acts_as_address
      class_eval do <<-DELIM
        # definicja walidatorw i skojarze
        validates_presence_of :line1, :city, :state, :zip_code, :phone_number
        validates_length_of :line_1, :maximum => 256
        validates_length_of :line_2, :maximum => 256
        validates_length_of :city,   :maximum => 128
        validates_length_of :state,  :maximum => 2
        belongs_to  :zip_code, :foreign_key => :zip_code

        # definicja procedury find_within_miles 
        # dla wszystkich modeli zawierajcych adresy
        find_within_miles = Proc.new do |zip, miles|
          z = ZipCode.find_by_zip(zip)
          !z ? [] :
          self.class.find(:all,
                          :include => :zip_code,
                          :conditions => [
                                    "miles_between_lat_long(?, ?,
                                        zip_codes.latitude, zip_codes.longitude) < ?",
                                     z.latitude, z.longitude, miles])
        end  
        define_method :find_widthin_miles, find_within_miles
      DELIM 
    end
  end
    
  def self.included(base)
    base.extend ClassMethods
    base.class_eval do
      include InstanceMethods
    end
  end
end               

