[Moscow.pm] дефолтные методы объекта и AUTOLOAD
Гнатына
Гнатына
Ср Мар 28 02:43:05 PDT 2012
package My::Base;
sub _prop_simple_call{
my $self = shift;
my $name = shift;
if(@_){
$self->{$name} = $_[0];
}
return $self->{$name};
}
sub _make_simple_props{
my $class = shift;
my @names = @{shift||[]};
for my $name(@names){
no strict "refs";
my $func = $class.'::'.$name;
*$func = sub {
my $self = shift;
return $self->_prop_simple_call($name, @_);
}
}
}
package My::Some;
use base My::Base;
__PACAKGE__->_make_simple_props([qw(id name title)]);
В Срд, 28/03/2012 в 15:21 +0600, Nick Knutov пишет:
> Есть ряд объектов, у которых есть заранее известный, но иногда
> меняющийся [в процессе разработки] список полей, для которых надо писать
> геттеры вида
>
> sub id { my $self = shift; return $self->{id}; }
>
> Или с логикой чуть посложнее, но это еще один список полей и полностью
> одинаковый код, кроме имени поля.
>
> Возникла мысль генерить эти методы из заранее определенного списка на
> этапе, например, загрузки модуля или компиляции кода. perldoc что?
>
> Альтернативный вариант - сделать то же самое через AUTOLOAD, вот только
> в гугле находятся несколько очень разных примеров, как это делается, и в
> каждом говорится, что примеров есть разные, но вот именно этот способ
> лучше и избавит от разных проблем и багов. So, как все же это надо делать?
>
> --
> Best Regards,
> Nick Knutov
> http://knutov.com
> ICQ: 272873706
> Voice: +7-904-84-23-130
Подробная информация о списке рассылки Moscow-pm