lib/telephone_number/number.rb in telephone_number-1.2.0 vs lib/telephone_number/number.rb in telephone_number-1.2.1

- old
+ new

@@ -1,17 +1,35 @@ module TelephoneNumber class Number extend Forwardable - attr_reader :country, :parser, :formatter, :original_number + attr_reader :country, :parser, :formatter, :original_number, :geo_locator delegate [:valid?, :valid_types, :normalized_number] => :parser delegate [:national_number, :e164_number, :international_number] => :formatter - def initialize(number, country) - @original_number = number - @country = Country.find(country) + def initialize(number, country = nil) + @original_number = TelephoneNumber.sanitize(number) + @country = country ? Country.find(country) : detect_country @parser = Parser.new(self) @formatter = Formatter.new(self) + end + + def location(locale = :en) + @geo_locator ||= GeoLocator.new(self, locale) + @geo_locator.location + end + + private + + def detect_country + # note that it is entirely possible for two separate countries to use the same + # validation scheme. Take Italy and Vatican City for example. + eligible_countries = Country.all_countries.select do |country| + original_number.start_with?(country.country_code) && self.class.new(original_number, country.country_id).valid? + end + + detected_country = eligible_countries.detect(&:main_country_for_code) || eligible_countries.first + Country.find(detected_country.country_id.to_sym) if detected_country end end end