w3hello.com logo
Home PHP C# C++ Android Java Javascript Python IOS SQL HTML videos Categories
Perl Moose add instance attribute not class attribute

The trick is to create a new subclass of your original class, add the attribute to that, then rebless the instance into the new subclass. Here's an example:

use v5.14;

package Person {
  use Moose;
  has name => (is => 'ro');

sub add_attribute {
  my ($obj, $name, $value) = @_;
  my $new_class = Moose::Meta::Class->create_anon_class(
    superclasses => [ ref($obj) ],
  $new_class->add_attribute($name, is => 'rw');
  $new_class->rebless_instance($obj, $name => $value);

my $alice  = Person->new(name => 'Alice');
my $bob    = Person->new(name => 'Bob');

add_attribute($alice, foot_size => 6);

say $alice->foot_size;

say $bob->foot_size;  # dies, no such method

© Copyright 2018 w3hello.com Publishing Limited. All rights reserved.