def add_extension ext, *args
if not ext.is_a? Module
raise TypeError, "#{ext.inspect} is not a module"
elsif !(m = %w'Request Response NS_URI' -
ext.constants.map{ |c| c.to_s }).empty?
raise ArgumentError, "#{ext.inspect} missing #{m*', '}"
end
consts = [ext::Request, ext::Response]
if not consts.all?{|c| c.is_a? Class }
raise TypeError, "#{ext.inspect}'s Request or Response is not a class"
elsif not consts.all?{|c| ::OpenID::Extension > c }
raise ArgumentError, "#{ext.inspect}'s Request or Response not a decendant of OpenID::Extension"
end
if not ext::NS_URI.is_a? String
raise TypeError, "#{ext.inspect}'s NS_URI is not a string"
elsif not uri = URI(ext::NS_URI)
raise ArgumentError, "#{ext.inspect}'s NS_URI is not a valid uri"
elsif not uri.scheme =~ /^https?$/
raise ArgumentError, "#{ext.inspect}'s NS_URI is not an http uri"
elsif not uri.absolute?
raise ArgumentError, "#{ext.inspect}'s NS_URI is not and absolute uri"
end
@extensions[ext] = args
return ext::NS_URI
end