+\r
+ end\r
+ AsciiCasemap.instance\r
+\r
+\r
+ # This module is included by all classes that are either bound to a server\r
+ # or should have a casemap.\r
+ #\r
+ module ServerOrCasemap\r
+\r
+ attr_reader :server\r
+\r
+ # This method initializes the instance variables @server and @casemap\r
+ # according to the values of the hash keys :server and :casemap in _opts_\r
+ #\r
+ def init_server_or_casemap(opts={})\r
+ @server = opts.fetch(:server, nil)\r
+ raise TypeError, "#{@server} is not a valid Irc::Server" if @server and not @server.kind_of?(Server)\r
+\r
+ @casemap = opts.fetch(:casemap, nil)\r
+ if @server\r
+ if @casemap\r
+ @server.casemap.must_be(@casemap)\r
+ @casemap = nil\r
+ end\r
+ else\r
+ @casemap = (@casemap || 'rfc1459').to_irc_casemap\r
+ end\r
+ end\r
+\r
+ # This is an auxiliary method: it returns true if the receiver fits the\r
+ # server and casemap specified in _opts_, false otherwise.\r
+ #\r
+ def fits_with_server_and_casemap?(opts={})\r
+ srv = opts.fetch(:server, nil)\r
+ cmap = opts.fetch(:casemap, nil)\r
+ cmap = cmap.to_irc_casemap unless cmap.nil?\r
+\r
+ if srv.nil?\r
+ return true if cmap.nil? or cmap == casemap\r
+ else\r
+ return true if srv == @server and (cmap.nil? or cmap == casemap)\r
+ end\r
+ return false\r
+ end\r
+\r
+ # Returns the casemap of the receiver, by looking at the bound\r
+ # @server (if possible) or at the @casemap otherwise\r
+ #\r
+ def casemap\r
+ return @server.casemap if defined?(@server) and @server\r
+ return @casemap\r
+ end\r
+\r
+ # Returns a hash with the current @server and @casemap as values of\r
+ # :server and :casemap\r
+ #\r
+ def server_and_casemap\r
+ h = {}\r
+ h[:server] = @server if defined?(@server) and @server\r
+ h[:casemap] = @casemap if defined?(@casemap) and @casemap\r
+ return h\r
+ end\r
+\r
+ # We allow up/downcasing with a different casemap\r
+ #\r
+ def irc_downcase(cmap=casemap)\r
+ self.to_s.irc_downcase(cmap)\r
+ end\r
+\r
+ # Up/downcasing something that includes this module returns its\r
+ # Up/downcased to_s form\r
+ #\r
+ def downcase\r
+ self.irc_downcase\r
+ end\r
+\r
+ # We allow up/downcasing with a different casemap\r
+ #\r
+ def irc_upcase(cmap=casemap)\r
+ self.to_s.irc_upcase(cmap)\r
+ end\r
+\r
+ # Up/downcasing something that includes this module returns its\r
+ # Up/downcased to_s form\r
+ #\r
+ def upcase\r
+ self.irc_upcase\r
+ end\r
+\r