# HG changeset patch # User Sergey # Date 1249911548 -14400 # Node ID 78cd3855153421e93ffec2f4e16e9a0722f3818f # Parent 3b418b134d8ceb038c719d2d2661dfa2f0585e9d in develop diff -r 3b418b134d8c -r 78cd38551534 Lib/IMPL/Object.pm --- a/Lib/IMPL/Object.pm Fri Jul 17 13:30:46 2009 +0400 +++ b/Lib/IMPL/Object.pm Mon Aug 10 17:39:08 2009 +0400 @@ -1,123 +1,18 @@ package IMPL::Object; use strict; -use base qw(IMPL::Class::Meta); - -our $MemoryLeakProtection; -my $Cleanup = 0; -our $Debug; -our %leaked_objects; - -my %cacheCTOR; - - -sub new { - my $class = shift; - my $self = bless {}, ref($class) || $class; - - $self->$_(@_) foreach @{$cacheCTOR{ref $self} || cache_ctor(ref $self)}; - - $self; -} -my $t = 0; -sub cache_ctor { - my $class = shift; - - no strict 'refs'; - my @sequence; - - my $refCTORS = *{"${class}::CTOR"}{HASH}; - - foreach my $super ( @{"${class}::ISA"} ) { - my $superSequence = $cacheCTOR{$super} || cache_ctor($super); - - my $mapper = $refCTORS ? $refCTORS->{$super} : undef; - if (ref $mapper eq 'CODE') { - if ($mapper == *_pass_throgh_mapper{CODE}) { - push @sequence,@$superSequence; - } else { - push @sequence, sub { - my $this = shift; - $this->$_($mapper->(@_)) foreach @$superSequence; - }; - } - } else { - warn "Unsupported mapper type, in '$class' for the super class '$super'" if $mapper; - push @sequence, sub { - my $this = shift; - $this->$_() foreach @$superSequence; - }; - } - } - - push @sequence, *{"${class}::CTOR"}{CODE} if *{"${class}::CTOR"}{CODE}; - - $cacheCTOR{$class} = \@sequence; - return \@sequence; -} - -sub callCTOR { - my $self = shift; - my $class = ref $self; - - $self->$_(@_) foreach @{$cacheCTOR{$class} || cache_ctor($class)}; -} +use base qw(IMPL::Object::Abstract); sub surrogate { bless {}, ref $_[0] || $_[0]; } -sub superCTOR { - my $this = shift; - - warn "The mehod is deprecated, at " . caller; -} - -sub toString { - my $self = shift; - - return (ref $self || $self); -} - -sub DESTROY { - if ($MemoryLeakProtection and $Cleanup) { - my $this = shift; - warn sprintf("Object leaks: %s of type %s %s",$this->can('ToString') ? $this->ToString : $this,ref $this,UNIVERSAL::can($this,'_dump') ? $this->_dump : ''); - } -} - -sub END { - $Cleanup = 1; - $MemoryLeakProtection = 0 unless $Debug; -} - -sub _pass_throgh_mapper { - @_; -} - -sub PassThroughArgs { +sub new { my $class = shift; - $class = ref $class || $class; - no strict 'refs'; - no warnings 'once'; - ${"${class}::CTOR"}{$_} = \&_pass_throgh_mapper foreach @{"${class}::ISA"}; -} - -package self; - -our $AUTOLOAD; -sub AUTOLOAD { - goto &{caller(). substr $AUTOLOAD,4}; -} - -package supercall; - -our $AUTOLOAD; -sub AUTOLOAD { - my $sub; - my $methodName = substr $AUTOLOAD,11; - no strict 'refs'; - $sub = $_->can($methodName) and $sub->(@_) foreach @{caller().'::ISA'}; + my $self = bless {}, ref($class) || $class; + $self->callCTOR(@_); + + $self; } =pod @@ -173,15 +68,32 @@ # # Foo: Mazzi # Bar: Fugi -# Foo: # Bar: # Composite: Hello World! =h1 Description -Базовый класс для объектов. Реализует множественное наследование - +Базовый класс для объектов, основанных на хеше. =h1 Members + +=level 4 + +=item operator C(@args) + +Создает экземпляр объекта и вызывает конструктор с параметрами @args. + +=item operator C() + +Создает неинициализированный экземпляр объекта. + +=back + +=р1 Cavearts + +Нужно заметить, что директива C работает не совсем прозрачно, если в нашем примере +класс C наследуется от C, а затем C, то наследование от +C не произойдет поскольку он уже имеется в C. Вот не задача:) + =cut 1; \ No newline at end of file diff -r 3b418b134d8c -r 78cd38551534 Lib/IMPL/Object/Abstract.pm --- a/Lib/IMPL/Object/Abstract.pm Fri Jul 17 13:30:46 2009 +0400 +++ b/Lib/IMPL/Object/Abstract.pm Mon Aug 10 17:39:08 2009 +0400 @@ -1,27 +1,14 @@ package IMPL::Object::Abstract; use strict; use warnings; -package IMPL::Object; -use strict; use base qw(IMPL::Class::Meta); our $MemoryLeakProtection; my $Cleanup = 0; -our $Debug; -our %leaked_objects; my %cacheCTOR; - -sub new { - my $class = shift; - my $self = bless {}, ref($class) || $class; - - $self->$_(@_) foreach @{$cacheCTOR{ref $self} || cache_ctor(ref $self)}; - - $self; -} my $t = 0; sub cache_ctor { my $class = shift; @@ -66,10 +53,6 @@ $self->$_(@_) foreach @{$cacheCTOR{$class} || cache_ctor($class)}; } -sub surrogate { - bless {}, ref $_[0] || $_[0]; -} - sub superCTOR { my $this = shift; @@ -91,7 +74,6 @@ sub END { $Cleanup = 1; - $MemoryLeakProtection = 0 unless $Debug; } sub _pass_throgh_mapper { @@ -141,9 +123,6 @@ Реализация механизма вызова конструкторов и других вспомогательных вещей, кроме операторов создания экземпляров. - +=cut 1; - - -1; diff -r 3b418b134d8c -r 78cd38551534 Lib/IMPL/Object/ArrayBased.pm --- a/Lib/IMPL/Object/ArrayBased.pm Fri Jul 17 13:30:46 2009 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -package IMPL::Object::ArrayBased; -use strict; -use warnings; - -use base qw(IMPL::Object); - -sub new { - my $class = shift; - my $self = bless [], ref $class || $class; - $self->callCTOR(@_); - return $self; -} - -sub surrogate { - return bless [], ref $_[0] || $_; -} - -1; - diff -r 3b418b134d8c -r 78cd38551534 Lib/IMPL/Object/ArrayObject.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Object/ArrayObject.pm Mon Aug 10 17:39:08 2009 +0400 @@ -0,0 +1,19 @@ +package IMPL::Object::ArrayObject; +use strict; +use warnings; + +use base qw(IMPL::Object::Abstract); + +sub new { + my $class = shift; + my $self = bless [], ref $class || $class; + $self->callCTOR(@_); + return $self; +} + +sub surrogate { + return bless [], ref $_[0] || $_; +} + +1; + diff -r 3b418b134d8c -r 78cd38551534 Lib/IMPL/Object/List.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Object/List.pm Mon Aug 10 17:39:08 2009 +0400 @@ -0,0 +1,45 @@ +package IMPL::Object::List; +use strict; +use warnings; + +use base qw(IMPL::Object::ArrayObject); + +sub as_list { + return $_[0]; +} + +sub Append { + push @{$_[0]}, @_{1 .. @$_-1}; +} + +sub RemoveLast { + return pop @{$_[0]}; +} + +sub AddFirst { + return unshift @{$_[0]}, $_[1]; +} + +sub RemoveFirst { + return shift @{$_[0]}; +} + +sub Count { + return scalar @{$_[0]}; +} + +sub InsertAt { + my ($this,$index,@val) = @_; + + splice @$this,$index,0,@val; +} + +sub RemoveAt { + my ($this,$index,$count) = @_; + + $count ||= 1; + + return splice @$this,$index,$count; +} + +1; diff -r 3b418b134d8c -r 78cd38551534 _test/object.t --- a/_test/object.t Fri Jul 17 13:30:46 2009 +0400 +++ b/_test/object.t Mon Aug 10 17:39:08 2009 +0400 @@ -7,11 +7,11 @@ sub CTOR { my ($this,%args) = @_; - print "CTOR Foo $args{Name}\n"; + print "CTOR Foo says $args{Name}\n"; } sub Hello { - print "Hello"; + print "\tHello\n"; } package Bar; @@ -27,7 +27,4 @@ my $obj = new Bar ( Name => 'Tom') ; -Hello $obj; - -no strict 'refs'; -print "$_\n" foreach sort keys %{'Bar::'}; \ No newline at end of file +Hello $obj; \ No newline at end of file diff -r 3b418b134d8c -r 78cd38551534 impl.kpf --- a/impl.kpf Fri Jul 17 13:30:46 2009 +0400 +++ b/impl.kpf Mon Aug 10 17:39:08 2009 +0400 @@ -111,6 +111,58 @@ 1 Lib + + + + + + 9011 + + + Lib/IMPL/Object.pm + + Perl + + + + application/x-www-form-urlencoded + GET + 1 + 0 + 0 + + + enabled + + + default + + + + + + + 9011 + + + _test/object.t + + Perl + + + + application/x-www-form-urlencoded + GET + 1 + 0 + 0 + + + enabled + + + default +