1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
use Test::More tests => 45;
eval q{
package MyBase;
use Class::Std;
{
my %name : ATTR( :init_arg<name> :get<name> );
my %rank : ATTR( init_arg => 'rank' :get<rank> :set<rank> );
my %snum : ATTR( :init_arg('snum') :get<snum> );
my %priv : ATTR;
my %def : ATTR( :default<MyBase::def> :get<default> );
my %dval : ATTR( :default('dval') :get<dval> );
sub BUILD {
my ($self, $ident, $arg_ref) = @_;
::is ref $arg_ref, 'HASH' => 'Args passed to MyBase::BUILD in hash-ref';
::is ident $self, $ident => 'Identity correct in MyBase::BUILD';
$priv{$ident} = $arg_ref->{priv};
::is $priv{$ident}, 'MyBase::priv' => 'MyBase priv arg unpacked correctly';
$snum{$ident} = $arg_ref->{snum} . '!';
::is $snum{$ident}, 'MyBase::snum!' => 'MyBase snum arg unpacked correctly';
}
sub DEMOLISH {
my ($self, $ident) = @_;
::is ident $self, $ident => 'Identity correct in MyBase::DEMOLISH'
}
sub verify :CUMULATIVE {
my ($self) = @_;
my $ident = ident $self;
::is $name{$ident}, 'MyBase::name' => 'MyBase::name initialized';
::is $rank{$ident}, 'MyBase::rank' => 'MyBase::rank initialized';
::is $snum{$ident}, 'MyBase::snum!' => 'MyBase::snum initialized';
::is $priv{$ident}, 'MyBase::priv' => 'MyBase::name initialized';
::is $def{$ident}, 'MyBase::def' => 'MyBase::def initialized';
}
sub rest : RESTRICTED {
::ok 1, 'Accessed restricted';
}
}
package Der;
use Class::Std;
use base qw( MyBase );
{
my %name : ATTR( :init_arg<name> );
my %rank : ATTR( init_arg => 'rank' );
my %snum : ATTR( :init_arg('snum') :get<snum> );
my %priv : ATTR( :init_arg<priv> :get<priv> );
my %def : ATTR( :init_arg<def> :default<default def> :get<default> );
sub BUILD {
my ($self, $ident, $arg_ref) = @_;
::is ref $arg_ref, 'HASH' => 'Args passed to Der::BUILD in hash-ref';
::is ident $self, $ident => 'Identity correct in Der::BUILD';
}
sub DEMOLISH {
my ($self, $ident) = @_;
::is ident $self, $ident => 'Identity correct in Der::DEMOLISH'
}
sub verify :CUMULATIVE {
my ($self) = @_;
my $ident = ident $self;
::is $name{$ident}, 'MyBase::name' => 'Der::name initialized';
::is $rank{$ident}, 'generic rank' => 'Der::rank initialized';
::is $snum{$ident}, 'Der::snum' => 'Der::snum initialized';
::is $priv{$ident}, 'Der::priv' => 'Der::name initialized';
::is $def{$ident}, 'Der::def' => 'Der::def initialized';
$self->rest();
}
}
};
package main;
my $obj = MyBase->new({
name => 'MyBase::name',
snum => 'MyBase::snum',
rank => 'generic rank',
priv => 'generic priv',
MyBase => {
rank => 'MyBase::rank',
priv => 'MyBase::priv',
}
});
$obj->verify();
my $derobj = Der->new({
name => 'MyBase::name',
snum => 'MyBase::snum',
rank => 'generic rank',
priv => 'generic priv',
MyBase => {
rank => 'MyBase::rank',
priv => 'MyBase::priv',
},
Der => {
snum => 'Der::snum',
priv => 'Der::priv',
def => 'Der::def',
},
});
$derobj->verify();
is $derobj->get_name(), 'MyBase::name' => 'Der name read accessor';
is $derobj->get_rank(), 'MyBase::rank' => 'Der rank read accessor';
is $derobj->get_snum(), 'Der::snum' => 'Der rank read accessor';
is $derobj->get_priv(), 'Der::priv' => 'Der priv read accessor';
$derobj->set_rank('new rank');
is $derobj->get_rank(), 'new rank' => 'Der rank write accessor';
eval { $derobj->setname('new name') };
ok $@ =~ m/\ACan't locate object method "setname" via package "Der"/
=> 'Read only name attribute';
my $der2 = Der->new({
name => 'MyBase::name',
snum => 'MyBase::snum',
rank => 'generic rank',
priv => 'generic priv',
MyBase => {
rank => 'MyBase::rank',
priv => 'MyBase::priv',
},
Der => {
snum => 0,
priv => 'Der::priv',
},
});
is( $der2->get_snum(), 0, 'false values allowable as attribute parameters' );
is( $der2->get_dval, 'dval', 'default values evaled correctly' );
|