module FrozenAttributeTrait
  as_trait do |attribute|

    validate_attribute_not_changed = "validate_#{attribute}_not_changed"
    attribute_changed = "#{attribute}_changed?"
    attribute_was = "#{attribute}_was"

    validate validate_attribute_not_changed, :on => :update

    private

    define_method validate_attribute_not_changed do
      if send(attribute_changed) && !(send(attribute_was).blank? && send(attribute).blank?)
        errors.add(attribute, I18n.t('frozen_attribute'))
      end
      true
    end

  end
end
