Mercurial > pub > Impl
comparison _test/Test/Object/Destructors.pm @ 273:ad93c9f4dd93
+Added support for destructors, (special method named DTOR)
| author | sergey |
|---|---|
| date | Tue, 29 Jan 2013 17:19:10 +0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 272:47db27ed5b43 | 273:ad93c9f4dd93 |
|---|---|
| 1 package Test::Object::Destructors; | |
| 2 use strict; | |
| 3 | |
| 4 use IMPL::Test qw(test assert cmparray); | |
| 5 | |
| 6 use IMPL::declare { | |
| 7 base => [ | |
| 8 'IMPL::Test::Unit' => '@_' | |
| 9 ] | |
| 10 }; | |
| 11 | |
| 12 { | |
| 13 package Test::Object::Destructors::Foo; | |
| 14 use IMPL::Const qw(:prop); | |
| 15 use IMPL::declare { | |
| 16 base => [ | |
| 17 'IMPL::Object' => undef | |
| 18 ], | |
| 19 props => [ | |
| 20 trace => PROP_RO | |
| 21 ] | |
| 22 }; | |
| 23 | |
| 24 sub CTOR { | |
| 25 my ($this,$trace) = @_; | |
| 26 | |
| 27 $this->trace($trace); | |
| 28 } | |
| 29 | |
| 30 sub DTOR { | |
| 31 shift->Trace("Foo"); | |
| 32 } | |
| 33 | |
| 34 sub Trace { | |
| 35 my $this = shift; | |
| 36 push @{$this->trace||[]}, join ' ', @_; | |
| 37 } | |
| 38 | |
| 39 package Test::Object::Destructors::Bar; | |
| 40 use IMPL::declare { | |
| 41 base => [ | |
| 42 '-Test::Object::Destructors::Foo' => '@_' | |
| 43 ] | |
| 44 }; | |
| 45 | |
| 46 | |
| 47 sub DTOR { | |
| 48 shift->Trace("Bar"); | |
| 49 } | |
| 50 | |
| 51 package Test::Object::Destructors::Boss; | |
| 52 use IMPL::declare { | |
| 53 base => [ | |
| 54 '-Test::Object::Destructors::Bar' => '@_', | |
| 55 '-Test::Object::Destructors::Foo' => '@_', | |
| 56 ] | |
| 57 }; | |
| 58 | |
| 59 sub DTOR { | |
| 60 shift->Trace("Boss"); | |
| 61 } | |
| 62 } | |
| 63 | |
| 64 use constant { | |
| 65 Foo => 'Test::Object::Destructors::Foo', | |
| 66 Bar => 'Test::Object::Destructors::Bar', | |
| 67 Boss => 'Test::Object::Destructors::Boss' | |
| 68 }; | |
| 69 | |
| 70 test ObjectHasDestructor => sub { | |
| 71 my @expected = qw( Foo ); | |
| 72 my @trace; | |
| 73 { | |
| 74 my $foo = Foo->new(\@trace); | |
| 75 }; | |
| 76 assert( | |
| 77 cmparray(\@expected,\@trace), | |
| 78 "Wrong destructors sequence", | |
| 79 "expected: ", | |
| 80 join(", ",@expected), | |
| 81 "got: ", | |
| 82 join(", ", @trace) | |
| 83 ); | |
| 84 }; | |
| 85 | |
| 86 test InheritanceWithDestructor => sub { | |
| 87 my @expected = qw( Bar Foo ); | |
| 88 my @trace; | |
| 89 { | |
| 90 my $bar = Bar->new(\@trace); | |
| 91 }; | |
| 92 assert( | |
| 93 cmparray(\@expected,\@trace), | |
| 94 "Wrong destructors sequence", | |
| 95 "expected: ", | |
| 96 join(", ",@expected), | |
| 97 "got: ", | |
| 98 join(", ", @trace) | |
| 99 ); | |
| 100 }; | |
| 101 | |
| 102 test MultipleInheritanceWithDestructor => sub { | |
| 103 my @expected = qw( Boss Bar Foo Foo ); | |
| 104 my @trace; | |
| 105 { | |
| 106 my $boss = Boss->new(\@trace); | |
| 107 }; | |
| 108 assert( | |
| 109 cmparray(\@expected,\@trace), | |
| 110 "Wrong destructors sequence", | |
| 111 "expected: ", | |
| 112 join(", ",@expected), | |
| 113 "got: ", | |
| 114 join(", ", @trace) | |
| 115 ); | |
| 116 }; | |
| 117 | |
| 118 1; |
