Mercurial > pub > Impl
diff lib/IMPL/Object.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
author | cin |
---|---|
date | Fri, 04 Sep 2015 19:40:23 +0300 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/IMPL/Object.pm Fri Sep 04 19:40:23 2015 +0300 @@ -0,0 +1,110 @@ +package IMPL::Object; +use strict; + +use parent qw(IMPL::Object::Abstract); +use IMPL::require { + ClassPropertyImplementor => 'IMPL::Code::DirectPropertyImplementor' +}; + +sub surrogate { + bless {}, ref $_[0] || $_[0]; +} + +sub new { + my $class = shift; + my $self = bless {}, ref($class) || $class; + $self->callCTOR(@_); + + $self; +} + +1; + +__END__ + +=pod + +=head1 SINOPSYS + +=begin code + +package Foo; +use parent qw(IMPL::Object); + +sub CTOR { + my ($this,$arg) = @_; + print "Foo: $arg\n"; +} + +package Bar; +use parent qw(IMPL::Object); + +sub CTOR { + my ($this,$arg) = @_; + print "Bar: $arg\n"; +} + +package Baz; +use parent qw(Foo Bar); + +our %CTOR = ( + Foo => sub { my %args = @_; $args{Mazzi}; }, + Bar => sub { my %args = @_; $args{Fugi}; } +); + +package Composite; +use parent qw(Baz Foo Bar); + +our %CTOR = ( + Foo => undef, + Bar => undef +); + +sub CTOR { + my ($this,%args) = @_; + + print "Composite: $args{Text}\n"; +} + +package main; + +my $obj = new Composite( + Text => 'Hello World!', + Mazzi => 'Mazzi', + Fugi => 'Fugi' +); + +# will print +# +# Foo: Mazzi +# Bar: Fugi +# Bar: +# Composite: Hello World! + +=end code + +=head1 Description + +Базовый класс для объектов, основанных на хеше. + +=head1 Members + +=over + +=item operator C<new>(@args) + +Создает экземпляр объекта и вызывает конструктор с параметрами @args. + +=item operator C<surrogate>() + +Создает неинициализированный экземпляр объекта. + +=back + +=head1 Cavearts + +Нужно заметить, что директива C<use parent> работает не совсем прозрачно, если в нашем примере +класс C<Composite> наследуется от C<Baz>, а затем C<Foo>, то наследование от +C<Foo> не произойдет поскольку он уже имеется в C<Baz>. Вот не задача:) + +=cut