| 
407
 | 
     1 package IMPL::Object::Disposable;
 | 
| 
 | 
     2 use strict;
 | 
| 
 | 
     3 require IMPL::Object::AutoDispose;
 | 
| 
 | 
     4 
 | 
| 
 | 
     5 our $Strict = 1;
 | 
| 
 | 
     6 
 | 
| 
 | 
     7 sub Dispose {
 | 
| 
 | 
     8     my ($this) = @_;
 | 
| 
 | 
     9 
 | 
| 
 | 
    10     bless $this, 'IMPL::Object::Disposed';
 | 
| 
 | 
    11 }
 | 
| 
 | 
    12 
 | 
| 
 | 
    13 sub DTOR {
 | 
| 
 | 
    14     my ($this) = @_;
 | 
| 
 | 
    15 
 | 
| 
 | 
    16     warn sprintf('The object %s were marked as disposable but isn\'t disposed properly', $this->can('ToString') ? $this->ToString() : (ref $this || $this) );
 | 
| 
 | 
    17 }
 | 
| 
 | 
    18 
 | 
| 
 | 
    19 sub AutoPtr {
 | 
| 
 | 
    20     IMPL::Object::AutoDispose->new(shift);
 | 
| 
 | 
    21 }
 | 
| 
 | 
    22 
 | 
| 
 | 
    23 package IMPL::Object::Disposed;
 | 
| 
 | 
    24 our $AUTOLOAD;
 | 
| 
 | 
    25 sub AUTOLOAD {
 | 
| 
 | 
    26     return if $AUTOLOAD eq __PACKAGE__.'::DESTROY';
 | 
| 
 | 
    27     die new IMPL::Exception('Object have been disposed',$AUTOLOAD);
 | 
| 
 | 
    28 }
 | 
| 
 | 
    29 
 | 
| 
 | 
    30 sub isDisposed {
 | 
| 
 | 
    31     1;
 | 
| 
 | 
    32 }
 | 
| 
 | 
    33 
 | 
| 
 | 
    34 1;
 |