use strict; use warnings; use Test::More 0.88; use if $ENV{AUTHOR_TESTING}, 'Test::Warnings'; use Test::Fatal; { package WithLvalue; my $f; sub lvalue_method :lvalue { $f } sub other_method { 1 } my @array; sub array_lvalue :lvalue { @array } } { package Around; use Class::Method::Modifiers; our @ISA = qw(WithLvalue); around lvalue_method => sub :lvalue { my $orig = shift; $orig->(@_); }; my $d; around other_method => sub :lvalue { $d; }; around array_lvalue => sub :lvalue { $_[0]->(@_[1..$#_]); }; } Around->lvalue_method = 1; is(Around->lvalue_method, 1, 'around on an lvalue attribute is maintained'); Around->other_method = 2; is(Around->other_method, 2, 'around adding an lvalue attribute works'); (Around->array_lvalue) = (1,2); is_deeply([WithLvalue->array_lvalue], [1,2], 'around on array lvalue attribute works'); { package Before; use Class::Method::Modifiers; our @ISA = qw(WithLvalue); before lvalue_method => sub {}; } Before->lvalue_method = 3; is(Before->lvalue_method, 3, 'before maintains lvalue attribute'); { package After; use Class::Method::Modifiers; our @ISA = qw(WithLvalue); after lvalue_method => sub {}; after array_lvalue => sub {}; } After->lvalue_method = 4; is(After->lvalue_method, 4, 'after maintains lvalue attribute'); { local $TODO = "can't apply after to array lvalue method"; is exception { (After->array_lvalue) = (3,4) }, undef, 'assigning to array lvalue attribute causes no errors'; is_deeply([After->array_lvalue], [3,4], 'after array lvalue attribute sets values'); } done_testing;