package Player; #[...] sub defaults { my $self= shift; return $self->SUPER::defaults(), 'symbol' => '_', 'score' => 0, } #[...] package Mover; #[...] sub defaults { my $self= shift; return $self->SUPER::defaults, 'symbol' => '?', # override this in subclasses 'x' => 0, # x-coordinate 'y' => 0, # y-coordinate 'vx' => 0, # velocity in x-direction 'vy' => 0, # velocity in y-direction 'shown' => 1, # still alive? } #[...] package Object; #[...] sub defaults { return; } sub init { my ($self, $args) = @_; my ($defaults)= { $self->SUPER::defaults() }; @{$self}{keys %$defaults}= values %$defaults; # If %args are given to new(), use those instead @{$self}{keys %$args}= values %$args; }