             username: username
             path: path
 
+    # Either get or set the failure information of the method that
+    # is being described by this document. If you do no supply any
+    # arguments this method will return already described failures.
+    # Each failure consists of the expected code and reason for fail
+    failure: (code, reasoning) ->
+        return @$failure if arguments.length is 0
+        noCode = "the supplied code is not a number"
+        noReasoning = "the reasoning is not a string"
+        assert _.isString(reasoning), noReasoning
+        assert  code and _.isNumber(code), noCode
+        @emit.call this, "failure", arguments...
+        return (@$failure ?= []).push
+            reasoning: reasoning
+            code: code
+
+    # Either get or set the version information of the method that
+    # is being described by this document. If you do no supply any
+    # arguments this method will return already described failures.
+    # The version should be a string with an arbitrary contents.
+    version: (version) ->
+        return @$version if arguments.length is 0
+        noVersion = "version should be a string"
+        assert _.isString(version), noVersion
+        @emit.call this, "version", arguments...
+        return @$version = vesrion.toString()
+
+    # Either get or set the remark to the method that is being
+    # described by this document. If you do not supply example
+    # this method will return you one, assuming it was set before.
+    # Notes are warning/beware messages about the implementation.
+    remark: (remark) ->
+        return @$remark if arguments.length is 0
+        noRemark = "the remark is not a string"
+        assert _.isString(remark), noRemark
+        @emit.call this, "remark", arguments...
+        return @$remark = remark.toString()
+
+    # Either get or set the inputs of the method that is being
+    # described by this document. If you do not supply inputs
+    # this method will return you one, assuming it was set before.
+    # Inputs is a description of the body that method expects.
+    inputs: (inputs) ->
+        return @$inputs if arguments.length is 0
+        noInputs = "the inputs is not a string"
+        assert _.isString(inputs), noInputs
+        @emit.call this, "inputs", arguments...
+        return @$inputs = inputs.toString()
+
+    # Either get or set the outputs of the method that is being
+    # described by this document. If you do not supply outputs
+    # this method will return you one, assuming it was set before.
+    # Outputs is a description of data returned by the method.
+    outputs: (outputs) ->
+        return @$outputs if arguments.length is 0
+        noOutputs = "the outputs is not a string"
+        assert _.isString(outputs), noOutputs
+        @emit.call this, "outputs", arguments...
+        return @$outputs = outputs.toString()
+
+    # Either get or set the description of the method that is being
+    # described by this document. If you do not supply description
+    # this method will return you one, assuming it was set before.
+    # Synopsis is a brief story of what this service method does.
+    synopsis: (synopsis) ->
+        return @$synopsis if arguments.length is 0
+        noSynopsis = "the synopsis is not a string"
+        assert _.isString(synopsis), noSynopsis
+        @emit.call this, "synopsis", arguments...
+        return @$synopsis = synopsis.toString()
+
     # Either get or set the relevant information of the method that
     # is being described by this document. If you do no supply any
     # arguments this method will return already described failures.

        assert _.all(consumes, _.isString), notString
        @$consumes = (@$consumes or []).concat consumes
        @emit.call @, "consumes", @$consumes, arguments

    # Either get or set the markings information of the method that
    # is being described by this document. If you do no supply any

# This approach gives unique ability to build self documented APIs.
module.exports.Document = class Document extends Archetype

    # Either get or set the argument information of the method that
    # is being described by this document. If you do no supply any
    # arguments this method will return already described arguments.
    # Argument consists of name, approximate type and description.
    argument: (identify, typeable, description) ->
        return @$argument if arguments.length is 0
        noIdentify = "the identify param is not a string"
        noTypeable = "the typeable param is not a string"
        noDescription = "the description is not a string"
        assert _.isString(description), noDescription
        assert _.isString(identify), noIdentify
