 
 extension Optional: Intable {}
 
+
+/// Anything that can present a word.
 public protocol Wordable {
+
+    /// The singular form of the word.
     var singularForm: String { get }
+
+    /// The plural form of the word.
     var pluralForm: String { get }
 }
 
+/// An implementation of the `Wordable` protocol.
 public struct Word: Wordable {
+
+    /// The singular form of the word.
     public var singularForm: String
+
+    /// The plural form of the word.
     public var pluralForm: String
 }
 
+/// `Pluralizer` makes the plural form of a word from its singular form.
 public protocol Pluralizer {
+
+    /**
+     Returns the plural form of the given word.
+
+     - Parameter word: the given word, in singular form.
+     - Returns: the plural form.
+     */
     static func apply(word: String) -> String
 }
 
+/// `SimplePluralizer` appends an "s" to a word to make its plural form.
 public class SimplePluralizer: Pluralizer {
+
+    /**
+     Returns the plural form of the given word by appending an "s".
+
+     - Parameter word: the given word, in singular form.
+     - Returns: the plural form.
+     */
     public class func apply(word: String) -> String {
         return word.characters.count == 0 ? "" : word + "s"
     }
 }
 
+/// `PluralizerType` holds the type of a pluralizer used for pluralization. The type must conforms to the `Pluralizer` protocol.
 public var PluralizerType: Pluralizer.Type = SimplePluralizer.self
 
 extension String: Wordable {
+
+    /// Holds the singular form of the word.
     public var singularForm: String {
         get {
             return self
         }
     }
 
+    /// Holds the plural form of the word.
     public var pluralForm: String {
         return PluralizerType.apply(self)
     }

    return (unwrapped1 as Wordable) ~ (unwrapped2 as Intable)
}

public func /(singularForm: String, pluralForm: String) -> Word {
    return Word(singularForm: singularForm, pluralForm: pluralForm)
}


infix operator ~ { precedence 131 }

/**
 Returns a pluralized string for the given `amount` and `word`.

 - Parameter amount: the amount.
 - Parameter word: the word.
 - Returns: the pluralized string for the given parameters.
 */
public func ~(amount: Intable, word: Wordable) -> String {
    let quantity = amount.int()
    let pluralizedWord = quantity == 1 ? word.singularForm : word.pluralForm
    return String(quantity) + (pluralizedWord.characters.count == 0 ? "" : " ") + pluralizedWord
}

/**
 Returns a pluralized string for the given `amount` and `word`, omitting the quantity.

 - Parameter amount: the amount.
 - Parameter word: the word.
 - Returns: the pluralized string for the given parameters, omitting the quantity.
 */
public func ~(word: Wordable, amount: Intable) -> String {
    return amount.int() == 1 ? word.singularForm : word.pluralForm
}

/**
 Returns a pluralized string for the given `amount` and `word`. Depending on the order of the parameters, the quantity could be or not be omitted.

 - Parameter optional1: either the amount or the word.
 - Parameter optional2: the remaining parameter.
 - Returns: the pluralized string for the given parameters, the quantity could be ommited depending on the order of the parameters.
 */
public func ~(optional1: Optional<Any>, optional2: Optional<Any>) -> String {
    let unwrapped1 = optional1.unwrap()
    let unwrapped2 = optional2.unwrap()
