История изменений
Исправление DRVTiny, (текущая версия) :
Суть в том, что мне было бы намного удобнее использовать самые обычные переменные, но локализованные в объекте. Именно переменные, а не части структуры данных.
Замыкание позволяет именно так и делать: анонимная функция получает свой уникальный «слепок» переменных: хэши, массивы, скаляры - все они будут уникальны для каждой «благословлённой» анонимной функции-замыкания.
То есть я могу сделать вот так:
package My::Class;
my $lastCreatedObj;
sub new {
my ($class,%Config)=@_;
my %Props;
unless ($lastCreatedObject) {
foreach my $method ('debug') {
*$method=sub :lvalue {
my $self=ref($_[0]) eq 'My::Class'?shift:$lastCreatedObject;
die 'You MUST create class instance (object) to use class methods!' unless $self;
$self->(@_)
}
}
}
$lastCreatedObject=bless sub :lvalue {
my $methodName=shift;
my %methods=(
'debug'=>sub :lvalue {
$Config{'debug'}=shift if @_;
return $Config{'debug'}
},
'default'=>sub :lvalue {
my ($propName,$propVal)=@_;
$Props{$propName}=$propVal if defined($propVal);
return $Props{$propName};
},
)
if ($methods{$methodName}) {
$methods{$methodName}->(@_)
} else {
$methods{'default'}->($methodName,@_)
}
},$class;
}
Вот от этого я и расстраиваюсь сильно :)
P.S. Извините за код без подсветки, пойду читать справочник по LORCODE'у
Исходная версия DRVTiny, :
Суть в том, что мне было бы намного удобнее использовать самые обычные переменные, но локализованные в объекте. Именно переменные, а не части структуры данных.
Замыкание позволяет именно так и делать: анонимная функция получает свой уникальный «слепок» переменных: хэши, массивы, скаляры - все они будут уникальны для каждой «благословлённой» анонимной функции-замыкания.
То есть я могу сделать вот так:
package My::Class;
my $lastCreatedObj;
sub new {
my ($class,%Config)=@_;
my %Props;
unless ($lastCreatedObject) {
foreach my $method ('debug') {
*$method=sub :lvalue {
my $self=ref($_[0]) eq 'My::Class'?shift:$lastCreatedObject;
die 'You MUST create class instance (object) to use class methods!' unless $self;
$self->(@_)
}
}
}
$lastCreatedObject=bless sub :lvalue {
my $methodName=shift;
my %methods=(
'debug'=>sub :lvalue {
$Config{'debug'}=shift if @_;
return $Config{'debug'}
},
'default'=>sub :lvalue {
my ($propName,$propVal)=@_;
$Props{$propName}=$propVal if defined($propVal);
return $Props{$propName};
},
)
if ($methods{$methodName}) {
$methods{$methodName}->(@_)
} else {
$methods{'default'}->($methodName,@_)
}
},$class;
}