protected WrappedCalendarSystem(string name, CalendarSystem baseCalendar, FieldAssembler assembler, IEnumerable<Era> eras)
     : base(name, (builder, @this) => AssembleFields(builder, @this, baseCalendar, assembler), eras)
 {
     // Quick sanity check - the point of separating out this class is to only use it in
     // situations where we really have a calendar to wrap.
     if (baseCalendar == null)
     {
         throw new ArgumentNullException("baseCalendar");
     }
     this.baseCalendar = baseCalendar;
     // Work out which fields from the base are still valid, so we can
     // optimize by calling directly to the base calendar sometimes.
     FieldSet baseFields = baseCalendar.Fields;
     useBaseTimeOfDayFields = baseFields.HourOfDay == Fields.HourOfDay && 
                                 baseFields.MinuteOfHour == Fields.MinuteOfHour &&
                                 baseFields.SecondOfMinute == Fields.SecondOfMinute && 
                                 baseFields.MillisecondOfSecond == Fields.MillisecondOfSecond &&
                                 baseFields.TickOfMillisecond == Fields.TickOfMillisecond &&
                                 baseFields.TickOfSecond == Fields.TickOfSecond;
     useBaseTickOfDayFields = baseFields.TickOfDay == Fields.TickOfDay;
     useBaseYearMonthDayFields = baseFields.Year == Fields.Year &&
                                 baseFields.MonthOfYear == Fields.MonthOfYear &&
                                 baseFields.DayOfMonth == Fields.DayOfMonth;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="CalendarSystem"/> class.
 /// </summary>
 /// <param name="name">The name of the calendar</param>
 /// <param name="fieldAssembler">Delegate to invoke in order to assemble fields for this calendar.</param>
 /// <param name="eras">The eras within this calendar, which need not be unique to the calendar.</param>
 internal CalendarSystem(string name, FieldAssembler fieldAssembler, IEnumerable<Era> eras)
 {
     this.name = name;
     this.eras = new List<Era>(eras).AsReadOnly();
     FieldSet.Builder builder = new FieldSet.Builder();
     fieldAssembler(builder, this);
     this.fields = builder.Build();
 }
 protected BasicFixedMonthCalendarSystem(string name, int minDaysInFirstWeek, FieldAssembler fieldAssembler, IEnumerable<Era> eras)
     : base(name, minDaysInFirstWeek, fieldAssembler, eras)
 {
 }
 protected BasicCalendarSystem(string name, int minDaysInFirstWeek, FieldAssembler assembler, IEnumerable<Era> eras)
     : base(name, AssembleFields + assembler, eras)
 {
     if (minDaysInFirstWeek < 1 || minDaysInFirstWeek > 7)
     {
         throw new ArgumentOutOfRangeException("minDaysInFirstWeek", "Minimum days in first week must be between 1 and 7 inclusive");
     }
     this.minDaysInFirstWeek = minDaysInFirstWeek;
     // Effectively invalidate the first cache entry.
     // Every other cache entry will automatically be invalid,
     // by having year 0.
     yearCache[0] = new YearInfo(1, LocalInstant.LocalUnixEpoch.Ticks);
 }
 private GregorianCalendarSystem(string name, int minDaysInFirstWeek, FieldAssembler fieldAssembler)
     : base(name, minDaysInFirstWeek, fieldAssembler)
 {
 }
 protected BasicGJCalendarSystem(string name, int minDaysInFirstWeek, FieldAssembler fieldAssembler)
     : base(name, minDaysInFirstWeek, fieldAssembler, new[] { Era.BeforeCommon, Era.Common })
 {
 }
 private static void AssembleFields(FieldSet.Builder builder, CalendarSystem @this, CalendarSystem baseCalendar, FieldAssembler assembler)
 {
     builder.WithSupportedFieldsFrom(baseCalendar.Fields);
     assembler(builder, @this);
 }