class PersianCalendar extends AbstractCalendar {

    @Override
    public DateTimeUnit toIso( DateTimeUnit dateTimeUnit )
    {

        if ( dateTimeUnit.getYear() >= START_ISO.getYear() && dateTimeUnit.getYear() <= STOP_ISO.getYear() )
        {
            return new DateTimeUnit( dateTimeUnit.getYear(), dateTimeUnit.getMonth(), dateTimeUnit.getDay(),
                dateTimeUnit.getDayOfWeek(), true );
        }

        if ( dateTimeUnit.getYear() > STOP_PERSIAN.getYear() ||
            dateTimeUnit.getYear() < START_PERSIAN.getYear() )
        {
            throw new InvalidCalendarParametersException(
                "Illegal PERSIAN year, must be between " + START_PERSIAN.getYear() + " and " +
                    STOP_PERSIAN.getYear() + ", was given " + dateTimeUnit.getYear() );
        }

        DateTime dateTime = START_ISO.toJodaDateTime();

        int totalDays = 0;

        for ( int year = START_PERSIAN.getYear(); year < dateTimeUnit.getYear(); year++ )
        {
            totalDays += getYearTotal( year );
        }

        for ( int month = START_PERSIAN.getMonth(); month < dateTimeUnit.getMonth(); month++ )
        {
            totalDays += getDaysFromMap( dateTimeUnit.getYear(), month );
        }

        totalDays += dateTimeUnit.getDay() - START_PERSIAN.getDay();

        dateTime = dateTime.plusDays( totalDays );

        return new DateTimeUnit( DateTimeUnit.fromJodaDateTime( dateTime ), true );
    }

}