-
Notifications
You must be signed in to change notification settings - Fork 36
/
010-extension.t
74 lines (55 loc) · 2.01 KB
/
010-extension.t
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
#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
use mop;
class ClassAccessorMeta extends mop::class {
method FINALIZE {
foreach my $attribute ( $self->attributes ) {
$self->add_method(
mop::method->new(
name => $attribute->key_name,
body => sub {
my $self = shift;
$attribute->store_data_in_slot_for($self, shift ) if @_;
$attribute->fetch_data_in_slot_for($self);
}
)
);
}
$self->next::method;
}
}
class Foo meta ClassAccessorMeta {
has $!bar;
has $!baz;
}
ok(mop::meta('Foo')->has_method('bar'), '... the bar method was generated for us');
ok(mop::meta('Foo')->has_method('baz'), '... the baz method was generated for us');
{
my $foo = Foo->new;
ok($foo->isa( 'Foo' ), '... we is-a Foo');
ok($foo->isa( 'mop::object' ), '... we is-a Object');
is($foo->bar, undef, '... there is no value for bar');
is($foo->baz, undef, '... there is no value for baz');
eval { $foo->bar( 100 ) };
is($@, "", '... set the bar value without dying');
eval { $foo->baz( 'BAZ' ) };
is($@, "", '... set the baz value without dying');
is($foo->bar, 100, '... and got the expected value for bar');
is($foo->baz, 'BAZ', '... and got the expected value for bar');
}
{
my $foo = Foo->new( bar => 100, baz => 'BAZ' );
ok($foo->isa( 'Foo' ), '... we is-a Foo');
ok($foo->isa( 'mop::object' ), '... we is-a Object');
is($foo->bar, 100, '... and got the expected value for bar');
is($foo->baz, 'BAZ', '... and got the expected value for bar');
eval { $foo->bar( 300 ) };
is($@, "", '... set the bar value without dying');
eval { $foo->baz( 'baz' ) };
is($@, "", '... set the baz value without dying');
is($foo->bar, 300, '... and got the expected value for bar');
is($foo->baz, 'baz', '... and got the expected value for bar');
}
done_testing;