package My::Model;
use strict;
use warnings;
use Class::Extensible qw(clone_with);
use Class::Accessor::Lite(
new => 1,
ro => [qw(foo bar)],
);
sub with_baz {
my ($self, $baz) = @_;
return $self->clone_with('WithBaz', baz => $baz);
}
1;
package My::Model::WithBaz;
use strict;
use warnings;
use parent qw(My::Model);
use Class::Accessor::Lite(
new => 1,
ro => [qw(baz)],
);
1;
use My::Model;
my $obj = My::Model->new(foo => 3, bar => "bar");
$obj->isa('My::Model'); # 1 (true)
$obj->isa('My::Model::WithBaz'); # '' (false)
$obj->foo; # 3
$obj->bar; # "bar"
#$obj->baz; # Can't locate object method "baz" via package "My::Model" at test.pl line 11.
my $extended = $obj->with_baz(['baz']);
$extended->isa('My::Model'); # 1 (true)
$extended->isa('My::Model::WithBaz'); # 1 (true)
$extended->foo; # 3
$extended->bar; # "bar"
$extended->baz; # ["baz"]