module StripLeadingAndTrailingDot
  extend ActiveSupport::Concern

  # Strips leading and trailing dots from attributes
  #
  # using <tt>StripLeadingAndTrailingDot</tt> to strip the leading and trailing dots in +Domain+:
  #
  #  class Domain
  #     include StripLeadingAndTrailingDot
  #
  #     def dot_strip_attrs
  #     ['name']
  #     end
  #  end
  #
  # Saving a +Domain+ with the name <tt>'.foo.'</tt> saves it as <tt>'foo'</tt>

  included do
    before_validation :strip_dots
  end

  def strip_dots
    self.changes.each do |column, values|
      # return string if RuntimeError: can't modify frozen String
      if values.last.is_a?(String) && dot_strip_attrs.include?(column)
        self.send("#{column}=", values.last.gsub(/(^\.|\.$)/, '')) if respond_to?("#{column}=")
      end
    end
  end

  # default empty array - overwrite in each model for specific string fields that should have dots removed
  def dot_strip_attrs
    []
  end
end
