NAME
    Ucam::Term - return information about the start and end dates of terms
    (and a few related events) at the University of Cambridge, UK.

SYNOPSIS
      use Ucam::Term;

      my $term = Ucam::Term->new('m',2010);
      print $term->name, " term ", $term->year, " starts ";
      print $term->dates->start, "\n";

      my $term = Ucam::Term->new('e',2015);
      print "General Admission ", $term->year, " starts ";
      print $term->general_admission->start, "\n";

DESCRIPTION
    The academic year at the University of Cambridge, UK, is divided into
    three *Terms* - *Michaelmas* (autumn), *Lent* (spring) and *Easter*
    (summer). The half-way point of each term is called the *Division of
    Term*. Three quarters of each Term is designated *Full Term*, during
    which lectures are given and when undergraduate students are normally
    required to be in residence. Near the end of the Easter Term there are
    three or four days of *General Admission*, during which degrees are
    conferred on those who have just successfully completed courses,
    followed by the *Long Vacation period of residence* during which some
    additional courses of instruction are given.

    The dates of some of these events and periods are fixed, but others
    depend on dates that appear in the University's published 'Ordnances'
    (see "SEE ALSO" below for references) which are updated from time to
    time. This version of the module contains data covering the period from
    the Michaelmas Term 2007 to the Easter Term 2030.

    This module returns DateTime or DateTime::Span objects corresponding to
    these events and periods. Note that the DateTime::Span objects run from
    00:00 (inclusive) on the day the period starts to 00:00 (exclusive) on
    the day after the period ends (see DateTime::Span->end_is_open). This
    means that union/intersection/complement/intersects/contains operations
    will all work correctly, but that it is normally necessary to subtract
    one day from the end date of the span in order to find the date of the
    last day of the period.

METHODS
    *   Ucam::Term->new()

        Create a new Ucam::Term object

          my $term = Ucam::Term->new('michaelmas',2010);

        Requires two arguments: term and year. Term can be 'm', 'mich',
        'michaelmas', 'l', 'lent', 'e', 'easter' in any mixture of case.
        Year should be the full 4-digit year number. Croaks if given an
        unrecognised term. Otherwise returns a new Ucam::Term object.

    *   Ucam::Term->available_years()

        List years with useful information

          my @years = Ucam::Term->available_years

        Returns a sorted list of years for which at least some term date
        information is available. Some years returned will not have dates
        for all terms available (typically the first year will have only
        Michaelemas defined, the last only Lent and Easter). Convenient for
        iterating over all information available.

    *   $term->name()

        Extract term name

          my $name = $term->name

        Return the full, human-readable name of the term represented by the
        object ('Michaelmas', 'Lent', or 'Easter')

    *   $term->year()

        Extract term year

          my $year = $term->year

        Return the year of the term represented by the object.

    *   $term->dates()

        Return the term start/end dates for the object

          my $span = $term->dates

        Return a DateTime::Span representing the corresponding term. This
        runs from 00:00 on the first day of term (inclusive) to 00:00 on the
        day after term ends (exclusive). Returns undef unless the module has
        data for this term (even though this is really only needed for
        Easter terms)

    *   $term->fullterm_dates()

        Return the full term start/end dates for the object

           my $span = $term->fullterm_dates

        Return a DateTime::Span representing the corresponding full term.
        This runs from 00:00 on the first day of full term (inclusive) to
        00:00 on the day after full term ends (exclusive). Returns undef
        unless the module has data for this term.

    *   $term->division()

        Returns the date of the division of term

          $division = $term->division

        Returns a DateTime object representing 00:00 on the day
        corresponding to the division of term.

    *   $term->general_admission()

        Return the start/end dates for General Admission based on the table
        that appears in Ordinances, Chapter II, Section 10 'Dates of Term
        and Full Term' (see general_admission_alg() for what should be the
        same data derived from the algorythm in Ordinances, Chapter II,
        Section 12 'Admission to Degrees')

           my $span = $term->general_admission

        Return a DateTime::Span representing the period of General Admission
        following an Easter term. The span runs from 00:00 on the first day
        of General Admission (inclusive) to 00:00 on the day after the final
        day (exclusive). Returns undef unless the module has data for this
        term. Croaks if called on an object that doesn't represent an Easter
        term.

    *   $term->general_admission_alg()

        Return the start/end dates for General Admission based on the
        algorythm that appears in Ordinances, Chapter II, Section 12
        'Admission to Degrees' (see general_admission() for what should be
        the same data derived from the algorythm in Ordinances, Chapter II,
        Section 10 'Dates of Trem and Full Term' )

           my $span = $term->general_admission_alg

        Return a DateTime::Span representing the period of General Admission
        following an Easter term. The span runs from 00:00 on the first day
        of General Admission (inclusive) to 00:00 on the day after the final
        day (exclusive). Returns undef unless the module has data for this
        term. Croaks if called on an object that doesn't represent an Easter
        term.

    *   $term->long_vac()

        Return the start/end dates for the 'Long Vacation period of
        residence'

           my $span = $term->long_vac

        Return a DateTime::Span representing the period of the 'Long
        Vacation period of residence' that follows an Easter term. The span
        runs from 00:00 on the first day (inclusive) to 00:00 on the day
        after the final day (exclusive). Returns undef unless the module has
        data for this term. Croaks if called on an object that doesn't
        represent an Easter term.

AUTHOR
    Jon Warbrick, jw35@cam.ac.uk.

SEE ALSO
    University of Cambridge Statutes and Ordnances, Chapter II
    ("Matriculation, Residence, Admission to Degrees")
    (<http://www.admin.cam.ac.uk/univ/so/>) contains most of the rules
    implemented by this module:

        "Section 10: DATES OF TERM AND FULL TERM"

        "1. The Michaelmas Term shall begin on 1 October and shall consist
        of eighty days, ending on 19 December. The Lent Term shall begin on
        5 January and shall consist of eighty days, ending on 25 March or in
        any leap year on 24 March. The Easter Term shall begin on 10 April
        and shall consist of seventy days ending on 18 June, provided that
        in any year in which Full Easter Term begins on or after 22 April
        the Easter Term shall begin on 17 April and end on 25 June.

        "2. Full Term shall consist of three-fourths of the whole term
        reckoned from the first day of Full Term as hereinafter determined.

        "3. The dates on which Full Terms begin and end shall be as shown in
        the table appended to these regulations.

        "...

        "8. A course of instruction given during the Long Vacation shall not
        occupy more than four weeks. Except with the approval of the Council
        on the recommendation of the General Board, no such course given
        within the Precincts of the University shall begin earlier than the
        second Monday after General Admission or end later than the sixth
        Saturday after the Saturday of General Admission."

        "Section 12: ADMISSION TO DEGREES"

        [Prior to 2013]:

        "13. In every year the Thursday, Friday, and Saturday after the
        third Sunday in June shall be days of General Admission to Degrees,
        save that, in accordance with Regulation 3 for Terms and Long
        Vacation, in any year in which Full Easter Term begins on or after
        22 April the days of General Admission shall be the Thursday,
        Friday, and Saturday after the fourth Sunday in June. On each day of
        General Admission there shall be one or more Congregations for
        General Admission to Degrees at such hours as the Vice-Chancellor
        shall appoint."

        [As ammended by Grace 1 of 13 February 2013
        (http://www.admin.cam.ac.uk/reporter/2012-13/weekly/6297/section6.sh
        tml) with effect from 1 October 2013]:

        "13. Every year the Wednesday, Thursday, Friday, and Saturday after
        the third Sunday in June shall be days of General Admission to
        Degrees, save that, in accordance to Regulation 3 for Terms and Long
        Vacation, in any year in which Full Easter Term begins on or after
        22 April the days of General Admission shall be the Wednesday,
        Thursday, Friday, and Saturday after the fourth Sunday in June. On
        each day of General Admission there shall be one or more
        Congregations for General Admission to Degrees at such hours as the
        Vice-Chancellor shall appoint."

        [As ammended by Grace 2 of 5 February 2014
        (http://www.admin.cam.ac.uk/reporter/2013-14/weekly/6336/section8.sh
        tml)]

        "14. Every year the Wednesday, Thursday, Friday, and Saturday in the
        week next but one following the last week of Full Easter Term shall
        be days of General Admission to Degrees."

        [In practice, the dates of General Admission as given in the table
        in Section 10: 'Dates of Term and Full Term' appear to be cannonical
        - between 2010 and 2014 the dates in the table and the ordnance
        diagreed and it was the ordanance that was updated]

    Division of Term is best described in
    <http://www.cam.ac.uk/univ/termdates.html>:

        "Division of Term is half-way through Term (not Full Term). The
        dates are the same for every year except for Easter term: 9
        November, 13 February, and 14 May or 21 May depending on whether
        Easter Term starts on 10 April or 17 April."

    See also DateTime, DateTime::Span

COPYRIGHT and LICENSE
    Copyright (c) 2010, 2013, 2017 University of Cambridge Information
    Services. This program is free software; you can distribute it and/or
    modify it under the same terms as Perl itself.

    The full text of the license can be found in the LICENSE file included
    with this module.