class PsseRawReader {

    public PsseRawModel read(BufferedReader reader) throws IOException {
        Objects.requireNonNull(reader);

        // case identification
        PsseCaseIdentification caseIdentification = readCaseIdentification(reader);

        PsseRawModel model = new PsseRawModel(caseIdentification);

        // bus data
        model.getBuses().addAll(parseRecords(readRecordBlock(reader), PsseBus.class));

        // load data
        model.getLoads().addAll(parseRecords(readRecordBlock(reader), PsseLoad.class));

        // fixed shunt data
        model.getFixedShunts().addAll(parseRecords(readRecordBlock(reader), PsseFixedShunt.class));

        // generator data
        model.getGenerators().addAll(parseRecords(readRecordBlock(reader), PsseGenerator.class));

        // non transformer data
        model.getNonTransformerBranches().addAll(parseRecords(readRecordBlock(reader), PsseNonTransformerBranch.class));

        // transformer data
        model.getTransformers().addAll(readTransformers(reader));

        // area data
        model.getAreas().addAll(parseRecords(readRecordBlock(reader), PsseArea.class));

        // 2-terminal DC data
        readRecordBlock(reader); // TODO

        // voltage source converter data
        readRecordBlock(reader); // TODO

        // impedance correction data
        readRecordBlock(reader); // TODO

        // multi-terminal DC data
        readRecordBlock(reader); // TODO

        // multi-section line data
        readRecordBlock(reader); // TODO

        // zone data
        model.getZones().addAll(parseRecords(readRecordBlock(reader), PsseZone.class));

        // inter-area transfer data
        readRecordBlock(reader); // TODO

        // owner data
        model.getOwners().addAll(parseRecords(readRecordBlock(reader), PsseOwner.class));

        // facts control device data
        readRecordBlock(reader); // TODO

        // switched shunt data
        model.getSwitchedShunts().addAll(parseRecords(readRecordBlock(reader), PsseSwitchedShunt.class));

        // gne device data
        readRecordBlock(reader); // TODO

        // q record (nothing to do)
        readRecordBlock(reader);

        return model;
    }

}