# first level are package keys
type: dictionary
additionalProperties:
  # second level are fully qualified class names
  type: dictionary
  additionalProperties:
    # third level are actual class options
    type: dictionary
    additionalProperties: false
    properties:
      'scope': {type: string, enum: ['singleton', 'prototype', 'session']}
      'factoryObjectName': {type: string, format: class-name}
      'factoryMethodName': {type: string}
      'autowiring': {type: [boolean, string], enum: [true, false, 'on', 'off']}
      'className': {type: string, format: class-name}
      'arguments':
        type: array
        items:
          type: dictionary
          additionalProperties: false
          properties:
            'value': {type: any}
            'setting': {type: string}
            'object':
              -
                type: string
                format: class-name
              -
                type: dictionary
                additionalProperties: false
                properties:
                  'name': {type: string}
                  'factoryObjectName': {type: string, format: class-name}
                  'factoryMethodName': {type: string}
                  'arguments':
                    type: array
                    items:
                      type: dictionary
                      additionalProperties: false
                      properties:
                        'value': {type: string}
                        'setting': {type: string}

      'properties':
        type: dictionary
        additionalProperties:
          type: dictionary
          additionalProperties: false
          properties:
            'setting': {type: string}
            'value': {type: any}
            'object':
              -
                type: string
                format: class-name
              -
                type: dictionary
                additionalProperties: false
                properties:
                  'name': {type: string}
                  'factoryObjectName': {type: string, format: class-name}
                  'factoryMethodName': {type: string}
                  'arguments':
                    type: array
                    items:
                      type: dictionary
                      additionalProperties: false
                      properties:
                        'value': {type: string}
                        'setting': {type: string}

