FICA.pm

FICA->calculate(
    gross,  # gross pay
    date,    # date of payment
    YTD    # total FICA payments made year to date
)
{
  iterate over sorted keys descending in data hash.  
    Compare $date to keys.  
    Stop when $date >= key.  
    set $foundDate = $key.
    If date < all keys, that is an error.  

  my $cap = data{$foundDate}->{cap}
  my $rate = data{$foundDate}->{rate}
  if (YTD >= $cap)
    return 0
  else
  {
       fica = rate * gross
       if (fica + YTD <= cap)
            return fica
       else
           return (cap - YTD)  * rate
   }
}

data{$foundDate}->
{rate}
ex. data{20010101}->
{cap}

sub new()
{
    #create tables for lookup
  data{
    '19990101' => {rate => 0.0565, cap => 68000},
    '20010101' => {rate => 0.0565, cap => 72000}
  }    
}