Очень хочется делать так:
Описание класса:
package Object;
use strict;
use warnings;
our @EXPORT_OK=qw(new set_a get_a);
my $a='Hello';
sub new {
bless {},shift
};
calc_a {
my $v=shift;
$v.=' here'
}
sub set_a {
my $slf=shift;
$a=calc_a(shift)
};
sub get_a {
return $a
};
1;
Использование класса:
package main;
use strict;
use warnings;
use Object;
my $inst1=Object->new;
my $inst2=Object->new;
$inst1->set_a('Hot dog');
$inst2->set_a('Hot girl');
print join(' ','1)',$inst1->get_a,'2)',$inst2->get_a)."\n";
# $inst1->calc_a('Crazy man');
В результате должно быть выведено:
1) Hot dog 2) Hot girl
А если я раскомментирую последнюю строчку в main - Perl мне должен сказать «No such symbol calc_a in package Object» или что-то вроде этого - я же эту процедуру не экспортировал, а значит это «приватный метод».
Правильно ли я понимаю, что в Perl нельзя сделать так, чтобы переменные уровня пакета, в котором описан класс, были всё-таки переменными инстанса класса (конкретного объекта), а не просто переменными пакета?
Хранить данные в виде чего-то вроде $Config{refaddr $self}{'verbose'} - это по-моему извращение ещё более дикое, нежели хранение вообще всех данных внутри этой несчастной «благословлённой» (blessed) ссылки...
То есть чего бы хотелось:
1) чтобы при создании нового объекта происходило примерно то же, что и при fork'е процесса: все переменные пакета с их значениями копировались бы в адресное пространство объекта либо сразу, либо при первой же записи в них (а то копировать прямо всё и сразу может быть накладно).
2) нужно обязательное разделение методов на «приватные» и «публичные», чтобы я мог внутри объекта использовать те или иные процедуры, разрешая пользоваться извне лишь небольшим их подмножеством.
Можно ли как-то вот этак сделать в Perl или категорически нельзя?
P.S. Кстати, хранение всех собственных данных объекта в каком-нибудь громадном хэше, доступном по ссылке $ObjectData{refaddr $self}, то есть что-то вроде $ObjectData{refaddr $self}{'options'}{'user-defined'}{'var-a'} - это разве эффективно хотя бы с точки зрения скорости работы приложения? Как бы ни были эффективны хэши в Perl, по-моему все эти многоуровневые индексы куда менее эффективны, нежели простые переменные.