***************************************************** * GENERATED FILE, DO NOT EDIT * * THIS IS NO SOURCE FILE, BUT RESULT OF COMPILATION * ***************************************************** This file was generated by po4a(7). Do not store it (in VCS, for example), but store the PO file used as source file by po4a-translate. In fact, consider this as a binary, and the PO file as a regular .c file: If the PO get lost, keeping this translation up-to-date will be harder. =encoding UTF-8 =pod =head1 NAME Moose::Manual::Delegation - Moose 属性委托 =head1 VERSION version 2.0401 =head1 什么是属性委托? 属性委托是 Moose 的一大特性,它可以让你通过"中介"的方式来操作属性,这将简化你之后大量的工作。 通过这一特性,你将不需要过多的知道关于类的细节,也减少了需要学习的 API 的数量,这在一定程度上,降低了开发的成本。 委托是为多个方法定义的一个映射,是从真实存在的方法到委托方法的映射。 委托也是一种很重要的方式去封装一个类,特别是一个非 Moose 类,或者是一个难以继承的类。 =head1 定义一个映射 Moose 提供了一系列从简单到复杂的方法来定义委托。 最简单的方式就是显示的列出所要委托的方法: package Website; use Moose; has 'uri' => ( is => 'ro', isa => 'URI', handles => [qw( host path )], ); 通过这个定义,我们便可以成功调用 C<< $website->host >>,而实际上,却是在调用C<< $website->uri->host >>。 我们也可以定义一个映射到哈希引用,这允许你为某些方法加上别名。 package Website; use Moose; has 'uri' => ( is => 'ro', isa => 'URI', handles => { hostname => 'host', path => 'path', }, ); 在这个例子中,我们创建了 C<< $website->hostname >> 方法,而不是用 C模块中的 C。 这两种委托形式你以后将经常用到。剩下的方式会有些复杂。 has 'uri' => ( is => 'ro', isa => 'URI', handles => S ); 这和列表方式定义委托类似,只不过这里用正则表达式来匹配相应的方法。为了使它正确运行,你必须通过 C 参数来指明属性类型,之后,Moose 会通过内部的自省机制来找到相应的方法。 你也可以用一个角色名当作 C 的结果: has 'uri' => ( is => 'ro', isa => 'URI', handles => 'HasURI', ); Moose 会根据你所提供的角色来决定调用哪个方法。 当然,你也可以通过提供一个函数引用来I<生成>相应的映射。查阅 L 来得到更多的信息。 =head1 本地委托 本地委托允许你委托一些标准的 Perl 数据结构。 has 'queue' => ( traits => ['Array'], isa => 'ArrayRef[Item]', default => sub { [ ] }, handles => { add_item => 'push', next_item => 'shift', }, ) C 里的 C 表明你想要 Moose 为你设置数组的 helper。Moose 将会为你创建 C 和 C 方法来保证"正常的工作"。内部的实现如下: sub add_item { my ($self, @items) = @_; for my $item (@items) { $Item_TC->validate($item); } push @{ $self->queue }, @items; } Moose 将为本地委托包含如下的 traits: =over 4 =item * L =item * L =item * L =item * L =item * L =item * L =item * L =back =head1 局部套用 局部套用允许你创建一个预设参数的方法。创建方法如下: package Spider; use Moose; has request => ( is => 'ro', isa => 'HTTP::Request', handles => { set_user_agent => [ header => 'UserAgent' ], }, ) 通过如此定义,调用 C<< $spider->set_user_agent('MyClient') >> 将会调用C<< $spider->request->header('UserAgent', 'MyClient') >>。 局部套用将传递 C<$_[0]> 作为第一个参数,传递给委托的参数将是局部套用的参数。 =head1 缺失相应委托 如果调用一个不存在的委托,Moose 将会抛出异常。 =head1 作者 Moose 是由许多志愿者共同努力的结果。具体的请查看 L 和L译者:xiaomo(wxm4ever@gmail.com) =head1 版权和许可 This software is copyright (c) 2011 by Infinity Interactive, Inc.. 这是自由软件,您可以重新分配或根据 Perl 5 的编程语言系统本身相关的条款进行修改。