[Moscow.pm] дефолтные методы объекта и AUTOLOAD
Vladimir Timofeev
vovkasm на gmail.com
Ср Мар 28 08:05:38 PDT 2012
28 марта 2012 г. 13:54 пользователь Nick Knutov <mail на knutov.com> написал:
> Вещи, имеющие синтаксис вида
>
> has 'x' => (is => 'rw', isa => 'Int');
> has 'y' => (is => 'rw', isa => 'Int');
>
> не вариант вообще. Это плохо, это многобукв, так писать не надо.
Ага, конечно:
has($_,is => 'ro') for qw/id ident x y/;
Или:
use Class::XSAccessor {
getters => [qw/id ident x y/],
};
Если не нравится, ни Moo*, ни Class::Accessor-образные модули, не
вопрос, изобретайте велосипеды... Но для хорошего велосипеда,
действительно придется не читать много рецептов "как сделать
AUTOLOAD", а реально УЗНАТЬ КАК ЭТО работает. Начать стоит с perldoc
perl*, потом все тут перечисленные и многие не перечисленные модули
при том не доки, а исходники, потом, возможно, внутренности перла ;-)
>
>
> 28.03.2012 15:52, Alexandr Alexeev написал:
>>
>> https://metacpan.org/module/Mouse умеет это и кое-что другое. Работает
>> быстро, так что не путать с Moose.
>>
>> 28 марта 2012 г. 13:43 пользователь Гнатына Александр <gnatyna на ya.ru
>> <mailto:gnatyna на ya.ru>> написал:
>>
>>
>>
>> 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 mailing list
>> moscow-pm на pm.org <mailto:moscow-pm на pm.org> | http://moscow.pm.org
>>
>>
>>
>>
>>
>> --
>> С уважением, Александр
>> Личный блог: http://eax.me/
>> Мой форум: http://it-talk.org/
>> Мой Twitter: http://twitter.com/afiskon
>>
>>
>>
>
> --
> Best Regards,
> Nick Knutov
> http://knutov.com
> ICQ: 272873706
> Voice: +7-904-84-23-130
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
--
Vladimir Timofeev <vovkasm на gmail.com>
Подробная информация о списке рассылки Moscow-pm