Perl — цепочка вызовов методов

У меня есть класс, и я хочу связать вызовы его методов в строгом порядке, но не могу понять, как это сделать.

# Mail.pm

package Mail;

sub new { ... }
sub inbox { ... }
sub folder { ... }
sub count { ... }

1;

и позже ...

use Mail;

my $mail = Mail->new;

# ok
$mail->inbox->count;
$mail->folder('Spam')->count;

# prevent calling inbox() after folder() or vice versa
$mail->inbox->folder('Spam')->count;
$mail->folder('Spam')->inbox->count;

person abra    schedule 27.03.2015    source источник
comment
Какой вопрос?   -  person jpo38    schedule 27.03.2015


Ответы (1)


Ясно, что folder должен возвращать объект My::Mail::Folder, у которого есть счетчик, но нет метода inbox, а inbox должен возвращать объект My::Mail::Box, который имеет метод count, но не метод folder.

С другой стороны, я не уверен, почему $mail->inbox->folder('Spam')->count; проблематичен.

С другой стороны, почему вас привлекает цепочка методов?

Кроме того, имейте в виду, что существует множество модулей CPAN в пространстве имен Mail::, включая Mail::Box и это может помочь вашему здравомыслию в долгосрочной перспективе поместить вещи в пространство имен, которое с меньшей вероятностью будет растоптано модулем CPAN, который вам может понадобиться.

person Sinan Ünür    schedule 27.03.2015
comment
Спасибо за ваш ответ! - person abra; 27.03.2015
comment
@abra: С другой стороны, почему вас привлекает цепочка методов? Я согласен. Это очень похожий на Ruby подход, и он плохо показывает, что происходит в вашем коде. Суть в том, что каждый метод должен возвращать объект, предоставляющий следующий метод в цепочке. Для nwe это задано - он вернет объект Mail, который имеет метод inbox (но, пожалуйста, назовите его My::Mail или подобным, как сказал Синан, чтобы не конфликтовать с существующими классами). Но inbox и folder должны возвращать что-то отличное от другого объекта Mail, потому что они представляют разные вещи. - person Borodin; 27.03.2015