[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