txt: ## dist_zef-tbrowder-Date-Event.md
  [![Actions Status](https://github.com/tbrowder/Date-Event/actions/workflows/linux.yml/badge.svg)](https://github.com/tbrowder/Date-Event/actions) [![Actions Status](https://github.com/tbrowder/Date-Event/actions/workflows/macos.yml/badge.svg)](https://github.com/tbrowder/Date-Event/actions) [![Actions Status](https://github.com/tbrowder/Date-Event/actions/workflows/windows.yml/badge.svg)](https://github.com/tbrowder/Date-Event/actions)
  
  # NAME
  
  **Date::Event** - Provides a class suitable for use with calendars or any program using the Raku `Date` type
  
  # SYNOPSIS
  
  ```
  use Date::Event;
  
  my $date = Date.new: :year(2024), :month(12), :day(31);
  
  # Enter an Etype with a known enum EType name:
  my $e  = Date::Event.new: :$date, :Etype<Birthday>;
  
  # Enter an Etype with a known enum EType number
  my $e2 = Date::Event.new: :$date, :name<Easter>,:Etype(12); # Liturgy
  
  # Smart match on the enum attribute
  if $e2.Etype ~~ Liturgy {
      say $e2.name; # OUTPUT: «Easter␤»
  }
  
  ```
  
  # DESCRIPTION
  
  **Date::Event** is a class that provides basic attributes to describe an event occurring on a particular `Date`. It is suitable for multiple instances on a `Date` and is currently defined as follows:
  
  ```
  unit class Date::Event;
  
  enum EType is export (
      Unknown     => 0,
      Birth       => 1,
      Christening => 2,
      Baptism     => 3,
      BarMitzvah  => 4,
      BatMitzvah  => 5,
      Graduation  => 6,
      Wedding     => 7,
      Anniversary => 8,
      Retirement  => 9,
      Death       => 10,
      Birthday    => 11,
      Liturgy     => 12,
  
      Holiday     => 100,
      Astro       => 150,
      Other       => 200,
  );
  
  has Str   $.set-id                  = "";
  has Str   $.id                      = "";
  has Str   $.name;                   = "";
  has Str   $.short-name              = "";
  has       $.Etype                   = 0;
  has Date  $.date;
  has Date  $.date-observed;
  has Str   $.notes                   = "";
  has Bool  $.is-calculated           = False;
  
  # For use with Date::Utils:
  has UInt  $.nth-value;
  has UInt  $.nth-dow;
  has UInt  $.nth-month-number;
  
  # Attributes for Astro events:
  has Numeric  $.lat where {  -90 <= $_ <=  90 };
  has Numeric  $.lon where { -180 <= $_ <= 180 };
  has DateTime $.time;
  
  submethod TWEAK {
      $!Etype = self.etype($!Etype)
  }
  
  multi method etype(Str $v? --> UInt) {
      my %m = EType.enums;
      if $v.defined {
          return %m{$v}
      }
      else {
          return %m{self.Etype}
      }
  }
  
  multi method etype(UInt $v? --> EType) {
      if $v.defined {
          return EType($v)
      }
      else {
          return EType(self.Etype)
      }
  }
  
  method lat(Numeric $v?) {
      if $v.defined {
          $!lat = $v
      }
      else {
          return $!lat
      }
  }
  
  method lon(Numeric $v?) {
      if $v.defined {
          $!lon = $v
      }
      else {
          return $!lon
      }
  }
  
  # A default event is normally set on a certain date.  Many holidays
  # are an exception in that they are calculated based on one or more
  # date criteria or conversion from another calendar (e.g., from Jewish
  # to Gregorian).  }
  
  #= Enable the user to change the attribute
  #= during development
  method is-calculated(Bool $v?) {
      if $v.defined {
          $!is-calculated = $v
      }
      else {
          return $!is-calculated
      }
  }
  
  ```
  
  Published modules showing similar use are 'Holidays::US:Federal' and 'Holidays::Miscellaneous'. They include special databases that use the 'Date::Event' class to provide a common interface (API) for working with dates. Those modules are being integrated into the next version of published module 'Calendar'.
  
  # AUTHOR
  
  Tom Browder [tbrowder@acm.org](mailto:tbrowder@acm.org)
  
  # COPYRIGHT AND LICENSE
  
  © 2023-2024 Tom Browder
  
  This library is free software; you may redistribute it or modify it under the Artistic License 2.0.
  