
        *****************************************************
        *           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<URI.pm>模块中的 C<host>。

这两种委托形式你以后将经常用到。剩下的方式会有些复杂。

  has 'uri' => (
      is      => 'ro',
      isa     => 'URI',
      handles => S<qr/^( :host|path|query.*/,>
  );

这和列表方式定义委托类似，只不过这里用正则表达式来匹配相应的方法。为了使它正确运行，你必须通过
C<isa> 参数来指明属性类型，之后，Moose
会通过内部的自省机制来找到相应的方法。

你也可以用一个角色名当作 C<handles> 的结果：

  has 'uri' => (
      is      => 'ro',
      isa     => 'URI',
      handles => 'HasURI',
  );

Moose 会根据你所提供的角色来决定调用哪个方法。

当然，你也可以通过提供一个函数引用来I<生成>相应的映射。查阅
L<Moose> 来得到更多的信息。

=head1 本地委托

本地委托允许你委托一些标准的 Perl 数据结构。

  has 'queue' => (
      traits  => ['Array'],
      isa     => 'ArrayRef[Item]',
      default => sub { [ ] },
      handles => {
          add_item  => 'push',
          next_item => 'shift',
      },
  )

C<traits> 里的 C<Array> 表明你想要 Moose 为你设置数组的
helper。Moose 将会为你创建 C<add_item> 和 C<next_item>
方法来保证"正常的工作"。内部的实现如下：

  sub add_item {
      my ($self, @items) = @_;

      for my $item (@items) {
          $Item_TC->validate($item);
      }

      push @{ $self->queue }, @items;
  }

Moose 将为本地委托包含如下的 traits：

=over 4

=item * L<Array|Moose::Meta::Attribute::Native::Trait::Array>

=item * L<Bool|Moose::Meta::Attribute::Native::Trait::Bool>

=item * L<Code|Moose::Meta::Attribute::Native::Trait::Code>

=item * L<Counter|Moose::Meta::Attribute::Native::Trait::Counter>

=item * L<Hash|Moose::Meta::Attribute::Native::Trait::Hash>

=item * L<Number|Moose::Meta::Attribute::Native::Trait::Number>

=item * L<String|Moose::Meta::Attribute::Native::Trait::String>

=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<Moose/CABAL> 和L<Moose/CONTRIBUTORS>译者：xiaomo(wxm4ever@gmail.com)

=head1 版权和许可

This software is copyright (c) 2011 by Infinity Interactive, Inc..

这是自由软件，您可以重新分配或根据 Perl 5
的编程语言系统本身相关的条款进行修改。

