extends 'Point'; has 'z' => (isa => 'Num', is => 'rw'); after 'clear' => sub { my $self = shift; $self->z(0); }; sub set_to { @_ == 4 or croak "Bad number of arguments"; my $self = shift; my ($x, $y, $z) = @_; $self->x($x); $self->y($y); $self->z($z); } There is a new set_to() method in the Point3D class so the method of the same name defined in the Point class is not invoked in the case of Point3D instances. The clear() method on the other hand is not replaced but extended in the subclass, so both methods are run in the correct order. This is the same using the MooseX::Declare extension: use MooseX::Declare; class Point { has 'x' => (isa => 'Num', is => 'rw'); has 'y' => (isa => 'Num', is => 'rw'); method clear { $self->x(0); $self->y(0); } method set_to (Num $x, Num $y) { $self->x($x); $self->y($y); } } class Point3D extends Point { has 'z' => (isa => 'Num', is => 'rw'); after clear { $self->z(0); } method set_to (Num $x, Num $y, Num $z) { $self->x($x); $self->y($y); $self->z($z); } } See also Raku object system, is the inspiration for Moose Joose, a JavaScript framework inspired by Moose Catalyst, a web application framework using Moose References External links Moose Homepage Moose Documentation Perl modules Articles with example Perl code