tracks/perl6/exercises/space-age/Example.pm in trackler-2.0.8.28 vs tracks/perl6/exercises/space-age/Example.pm in trackler-2.0.8.29
- old
+ new
@@ -1,16 +1,32 @@
-our $earth_revolution = 31557600;
+unit module SpaceAge:ver<1>;
-our %planets = (
- mercury => 0.2408467,
- venus => 0.61519726,
- mars => 1.8808158,
- jupiter => 11.862615,
- saturn => 29.447498,
- uranus => 84.016846,
- neptune => 164.79132,
- earth => 1,
-);
+role Planet {
+ method age-on ($seconds) {
+ ($seconds / self.orbital-period).round(0.01);
+ }
+}
-sub age-on( $planet, $seconds ) is export {
- ( $seconds / %planets{$planet.lc} / $earth_revolution ).round(0.01);
+class Earth does Planet is export {
+ my $.orbital-period = 31557600;
+}
+
+my package EXPORT::DEFAULT {
+ my %planets = (
+ :Mercury(0.2408467),
+ :Venus(0.61519726),
+ :Mars(1.8808158),
+ :Jupiter(11.862615),
+ :Saturn(29.447498),
+ :Uranus(84.016846),
+ :Neptune(164.79132),
+ );
+ for %planets.kv -> $planet, $relative {
+ OUR::{$planet} := EVAL 'class :: does Planet {
+ my $.orbital-period = calculate-orbital-period $relative
+ }';
+ }
+}
+
+sub calculate-orbital-period ($relative-to-earth) {
+ Earth.orbital-period * $relative-to-earth;
}