private void toForester( final Writer writer ) throws IOException {
        final int longest = getLengthOfLongestState() + 5;
        writer.write( "Identifiers: " );
        writer.write( String.valueOf( getNumberOfIdentifiers() ) );
        writer.write( ForesterUtil.LINE_SEPARATOR );
        writer.write( "Characters : " );
        writer.write( String.valueOf( getNumberOfCharacters() ) );
        writer.write( ForesterUtil.LINE_SEPARATOR );
        writer.write( ForesterUtil.pad( "", 20, ' ', false ).toString() );
        writer.write( ' ' );
        for( int character = 0; character < getNumberOfCharacters(); ++character ) {
            final String c = getCharacter( character );
            writer.write( c != null ? ForesterUtil.pad( c, longest, ' ', false ).toString() : ForesterUtil
                    .pad( "", longest, ' ', false ).toString() );
            if ( character < getNumberOfCharacters() - 1 ) {
                writer.write( ' ' );
            }
        }
        writer.write( ForesterUtil.LINE_SEPARATOR );
        for( int identifier = 0; identifier < getNumberOfIdentifiers(); ++identifier ) {
            if ( getIdentifier( identifier ) != null ) {
                writer.write( ForesterUtil.pad( getIdentifier( identifier ), 20, ' ', false ).toString() );
                writer.write( ' ' );
            }
            for( int character = 0; character < getNumberOfCharacters(); ++character ) {
                final S state = getState( identifier, character );
                writer.write( state != null ? ForesterUtil.pad( state.toString(), longest, ' ', false ).toString()
                        : ForesterUtil.pad( "", longest, ' ', false ).toString() );
                if ( character < getNumberOfCharacters() - 1 ) {
                    writer.write( ' ' );
                }
            }
            if ( identifier < getNumberOfIdentifiers() - 1 ) {
                writer.write( ForesterUtil.LINE_SEPARATOR );
            }
        }
    }