module PriorityAttributesTrait
  as_trait do |priority_keys|

    priority_keys = priority_keys.collect(&:to_sym) + priority_keys.collect(&:to_s)

    define_method :attributes_with_priority= do |new_attributes|
      ordered_attributes = ActiveSupport::OrderedHash.new
      ordered_attributes.merge!(new_attributes.slice(*priority_keys))
      ordered_attributes.merge!(new_attributes.except(*priority_keys))
      send(:attributes_without_priority=, ordered_attributes)
    end

    alias_method_chain :attributes=, :priority

  end
end