#!/usr/bin/env perl use 5.010_000; use strict; use warnings; { package Polygon; use Moose; my $SIDES = 10; sub sides { my ($self, $new_sides) = @_; # Class or Instance ... if ( ! blessed $self ) { $self = $self->new; # This is a bit of a hack ... obviously =) } # Set sides if ($new_sides) { $self->{_SIDES} = \$new_sides; # You can make $SIDES readonly here. } # Get sides return ${ $self->{_SIDES} }; } sub BUILD { my ( $self, $params ) = @_; $self->sides( $params->{_SIDES} // $SIDES ); return $self; } no Moose; 1; } { package Triangle; use Moose; use Carp qw(carp); extends qw(Polygon); sub BUILD { my ( $self, $params ) = @_; if ( $params->{_SIDES} ) { carp sprintf 'Cannot alter SIDES with value (%s)', $params->{_SIDES}; } $self->{_SIDES} = \3; # ALWAYS 3 SIDES return $self; } no Moose; 1; } say {*STDERR} Polygon->sides; # 10 say {*STDERR} Polygon->new->sides; # 10 say {*STDERR} Polygon->new( _SIDES => 20 )->sides; # 20 say {*STDERR} Triangle->sides; # 3 say {*STDERR} Triangle->new->sides; # 3 say {*STDERR} Triangle->new( _SIDES => 4 )->sides; # 3 with warning message #### #!/usr/bin/env perl use 5.010_000; use strict; use warnings; { package Polygon; use Moose; use MooseX::ClassAttribute; class_has 'sides' => ( is => 'rw', isa => 'Int', default => sub { 10 }, ); __PACKAGE__->meta->make_immutable(); #MooseX::ClassAttribute::containing_class()->meta()->make_immutable(); no Moose; no MooseX::ClassAttribute; 1; } { package Triangle; use Moose; use MooseX::ClassAttribute; extends 'Polygon'; class_has '+sides' => ( default => sub { 3 }, ); __PACKAGE__->meta->make_immutable(); #MooseX::ClassAttribute::containing_class()->meta()->make_immutable(); no Moose; no MooseX::ClassAttribute; 1; } say {*STDERR} Polygon->sides; # 10 say {*STDERR} Polygon->new->sides; # 10 say {*STDERR} Triangle->sides; # 3 say {*STDERR} Triangle->new->sides; # 3 exit 0;