         }).map({
             "\($0): \($0)"
         }).joined(separator: ", ")
-        lines.append("\(indent2)init(\(arguments))")
+        lines.append("\(indent2)self.init(\(arguments))")
         lines.append("\(indent1)}")
         return lines.joined(separator: "\n")
     }

            case .isOptional:
                switch $0.type.plainType {
                case let .primitive(p):
                    lines.append("\(indent2)let \(propertyName) = json[\"\($0.name)\"] as? \(p.name)")
                case let .struct(s):
                    lines.append("\(indent2)let \(propertyName)JSONDictionary = json[\"\($0.name)\"] as? \(meta.jsonDictionaryName)")
                    lines.append("\(indent2)let \(propertyName) = \(propertyName)JSONDictionary.flatMap({ \(s.typeName)(json: $0) })")

        let indent1 = indentation.deeper.value
        let indent2 = indentation.deeper.deeper.value
        var lines: [String] = []
        lines.append("\(indent1)\(meta.publicCode) init?(json: \(meta.jsonDictionaryName)) {")
        properties.forEach {
            let propertyName = $0.name.propertyName(meta: meta)
            switch $0.type.status {
