Mercurial > pub > Impl
annotate Lib/IMPL/declare.pm @ 202:5146e17a7b76
IMPL::Web::Application::RestResource fixes, documentation
| author | sergey | 
|---|---|
| date | Wed, 25 Apr 2012 02:49:23 +0400 | 
| parents | 2ffe6f661605 | 
| children | a8db61d0ed33 | 
| rev | line source | 
|---|---|
| 197 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 1 package IMPL::declare; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 2 use strict; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 3 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 4 use Scalar::Util qw(set_prototype); | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 5 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 6 sub import { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 7 my ($self,$args) = @_; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 8 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 9 return unless $args; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 10 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 11 die "A hash reference is required" unless ref $args eq 'HASH'; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 12 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 13 no strict 'refs'; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 14 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 15 my $caller = caller; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 16 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 17 my $aliases = $args->{require} || {}; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 18 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 19 while( my ($alias, $class) = each %$aliases ) { | 
| 198 | 20 my $c = _require($class); | 
| 197 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 21 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 22 *{"${caller}::$alias"} = set_prototype(sub { | 
| 198 | 23 $c | 
| 197 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 24 }, ''); | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 25 } | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 26 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 27 my $base = $args->{base} || {}; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 28 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 29 my %ctor; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 30 my @isa; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 31 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 32 if (ref $base eq 'ARRAY') { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 33 @isa = map _require($_), @$base if @$base; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 34 } elsif (ref $base eq 'HASH' ) { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 35 while ( my ($class,$mapper) = each %$base ) { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 36 $class = $aliases->{$class} || _require($class); | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 37 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 38 push @isa,$class; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 39 $ctor{$class} = $mapper; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 40 } | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 41 } | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 42 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 43 *{"${caller}::CTOR"} = \%ctor; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 44 *{"${caller}::ISA"} = \@isa; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 45 } | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 46 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 47 sub _require { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 48 my ($class) = @_; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 49 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 50 if (not $class =~ s/^-//) { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 51 (my $file = $class) =~ s/::|'/\//g; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 52 require "$file.pm"; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 53 } | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 54 $class; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 55 } | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 56 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 57 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 58 1; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 59 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 60 __END__ | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 61 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 62 =pod | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 63 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 64 =head1 NAME | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 65 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 66 C<IMPL::declare> - описывает класс | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 67 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 68 =head1 SYNOPSIS | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 69 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 70 =begin code | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 71 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 72 package My::Bar; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 73 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 74 use IMPL::declare { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 75 require => { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 76 TFoo => 'My::Foo', | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 77 TBox => 'My::Box' | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 78 }, | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 79 base => { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 80 TFoo => '@_', | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 81 'IMPL::Object' => undef, | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 82 } | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 83 } | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 84 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 85 sub CreateBox { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 86 my ($this) = @_; | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 87 return TBox->new($this); | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 88 } | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 89 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 90 =end code | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 91 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 92 Специальная ситрока C<@_> означает передачу параметров конструктора текущего класса конструктору | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 93 базового класса без изменений. | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 94 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 95 =head1 DESCRIPTION | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 96 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 97 Описывает текущий пакет(модуль) как класс. В качестве параметра получает ссылку на хеш, | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 98 в которой храняться метаданные для объявления класса. | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 99 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 100 =head1 METADATA | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 101 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 102 =head2 C<require> | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 103 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 104 Содержит ссылку на хеш с синонимами модулей, которые будут доступны в текушем модуле, | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 105 аналогично использованию C<IMPL::require>. Однако, если модуль не требует загрузки при | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 106 помощи C<require> нужно использовать префикс C<'-'> в его имени | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 107 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 108 =begin code | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 109 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 110 { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 111 require => { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 112 TObject => 'IMPL::Object', # will be loaded with require | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 113 TFoo => '-My:App::Data::Foo' # will not use 'require' to load module | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 114 } | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 115 } | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 116 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 117 =end code | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 118 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 119 =head2 C<base> | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 120 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 121 Обисывает базове классы для текущего класса. Если данный параметр - ссылка массив, то | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 122 этот массив будет превращен в массив C<@ISA>. Если данный параметр - ссылка на хеш, то | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 123 его ключи опичавют список базовых классов, а значения - преобразование параметров для | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 124 вызова базовых конструкторов. | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 125 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 126 В качестве имен базовых классов могут быть как полные имена модулей, так и назначенные | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 127 ранее псевдонимы. Использование префикса C<'-'> перед B<полным именем модуля> означает, | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 128 что модуль не требуется загружать, в случае с псевдонимами, префикс C<'-'> уже был указан | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 129 при их объявлении. | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 130 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 131 =begin code | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 132 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 133 { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 134 require => { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 135 TFoo => '-My:App::Data::Foo' # will not use 'require' to load module | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 136 }, | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 137 base => { | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 138 TFoo => '@_', # pass parameters unchanged | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 139 'My::Base::Class' => sub { name => $_[0], data => $_[1] }, # remap parameters | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 140 '-My::Extentions' => undef, # do not pass any parameters | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 141 } | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 142 } | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 143 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 144 =end code | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 145 | 
| 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 sergey parents: diff
changeset | 146 =cut | 
