class CleanHash
  def self.pollute!
    ::Hash.class_eval do
      # merge but to not overwrite keys
      def deep_merge hash
        klass = ::CleanHash::DeepMerge
        klass[deep_clone].deep_merge klass[hash]
      end

      # true clone of the hash with 0 references to the old one
      def deep_clone
        Marshal.load(Marshal.dump(self))
      end

      def to_ch mode=nil
        if mode.is_a?(Array)
          if not_alowed = (keys - mode).first
            raise ArgumentError.new('CleanHash option "%s" is not alowed (%s)' % [not_alowed, mode.join(', ')])
          end

          mode.each { |el| self[el] = nil if self[el].nil? }
          ::CleanHash.create_struct self
        else
          mode ||= :indifferent
          ::CleanHash.create mode, self
        end
      end
    end
  end
end