     # @param [Object] property raw definition of property
     # @param [Object] ctx context for property
     # @return [Object] property context JSON Schema definition
+    #
+    # @todo Deal with property paths like `items.urls`
     #
     processAttribute: (property, ctx={}) ->
         # Process alias if required

        @cleanRefs()
        schema = @processRules(data, __path: '#')
        @resolveTypeReferences(schema)
        schema

    #

        # Process property type inline declaration
        if property.type?.rule?
            @processRule property.type, ctx
            property.type = _.pick(property.type, ['type', 'title', 'isArrayOf', 'arrayDepth'])

        # Process array properties
        if property.type?.isArrayOf
            @processArrayType(property, ctx)

        # Register reference for type
        if property.type?.type == 'object' then @registerTypeReference(property, ctx)

        # Return context
        ctx

    #
    # Converts array types to proper JSON schema.
    #
    # @param [Object] property type definition
    # @param [Object] ctx context for property
    # @return [Object] property context JSON Schema definition
    #
    processArrayType: (property, ctx) ->
        # We assuming that array is one level by default
        arrayDepth = property.type.arrayDepth || 1

        # Creating first level wrapper
        property.items = type: _.omit(property.type, ['isArrayOf', 'arrayDepth'])
        # Property now of type array
        property.type = 'array'

        # Save reference to type
        @registerTypeReference(property.items, ctx)

        # Further wrapping for multidimensional arrays
        while arrayDepth-- > 1
            property.items =
                type: 'array'
                items: property.items

        # Return context
        ctx
