use v5.12; use Data::Dumper (); { package Backpack; sub new { # the constructor my $class = shift; my %params = @_==1 ? %{$_[0]} : @_; my $self = bless {}, $class; $self->colour($params{'colour'} || 'black'); $self->contents($params{'contents'} || []); return $self; } sub colour { # a so-called "accessor" method my $self = shift; $self->{colour} = $_[0] if @_; return $self->{colour}; } sub contents { # another "accessor" method my $self = shift; $self->{contents} = $_[0] if @_; return $self->{contents}; } sub is_empty { my $self = shift; return (@{$self->contents} == 0); } sub add_item { my $self = shift; my ($item) = @_ or die "what item??\n"; push @{$self->contents}, $item; return $self; } sub paint { my $self = shift; my ($colour) = @_ or die "what colour??\n"; $self->colour($colour); return $self; } sub dump { my $self = shift; Data::Dumper::Dumper($self); } } my $x = Backpack->new(colour => "Red"); $x->add_item("keys"); $x->add_item("mobile phone"); $x->add_item("mobile phone charger"); my $y = Backpack->new(contents => ["pants"]); print $x->dump, $y->dump; #### use v5.12; { package Backpack; use Moose; has colour => ( accessor => 'colour', writer => 'paint', default => sub { 'black' }, ); has contents => ( traits => ['Array'], accessor => 'contents', default => sub { [] }, handles => { add_item => 'push', is_empty => 'is_empty', }, ); } my $x = Backpack->new(colour => "Red"); $x->add_item("keys"); $x->add_item("mobile phone"); $x->add_item("mobile phone charger"); my $y = Backpack->new(contents => ["pants"]); print $x->dump, $y->dump;