Date::Manip can handle complicated rules, such as good friday. Here's the definition of good friday in the Date::Manip holidays.cnf file I use:
1*0:0:0:0:0:0*EASTER,PD5 = Good Friday
Internally, it has the logic to determine when Easter is based on phases of the moon.