码神之路:Perl篇

Mojo::Base (不仅仅是对文档的翻译)

2016-09-30  本文已影响68人  JSON_NULL

Mojo::Base - Minimal base class for Mojo projects
<b> status: Completed </b>

有关Perl的学习、交流与分享,请关注专题:码神之路:Perl篇

简介

Mojo::BaseMojo 项目的一个最小基类
为 Mojo 项目提供了一个简单易用的接口,并且自动引用了 strict, warnings, utf8 和 5.10 特性。

有关 Mojo,Mojolicious 的介绍后续会慢慢整理并陆续更新,到时会在“这里”放上快速转向的链接。

## Automatically enables "strict", "warnings", "utf8" and Perl 5.10 features  
## 以下是三种 Mojo::Base 模块的使用方式
use Mojo::Base -strict;  
use Mojo::Base -base;  
use Mojo::Base 'SomeBaseClass';

Mojo::Base 有三种使用方式,都可以节省很多代码输入

use Mojo::Base -strict

## use Mojo::Base -strict;   相当于以下代码
use strict;  
use warnings;   
use utf8;   
use feature ':5.10'; 
use IO::Handle ();

use Mojo::Base -base

## use Mojo::Base -base;  相当于以下代码
use strict;  
use warnings;  
use utf8;   
use feature ':5.10'; 
use IO::Handle (); 
use Mojo::Base;  
push @ISA, 'Mojo::Base';  
sub has { Mojo::Base::attr(__PACKAGE__, @_) }      

use Mojo::Base 'SomeBaseClass'

 ## use Mojo::Base 'SomeBaseClass';   相当于以下代码
use strict;   
use warnings; 
use utf8; 
use feature ':5.10';  
use IO::Handle (); 
require SomeBaseClass;  
push @ISA, 'SomeBaseClass';  
use Mojo::Base;  
sub has { Mojo::Base::attr(__PACKAGE__, @_) }      

函数

Mojo::Base 实现了以下函数,并且它们可以通过 -base 标记或设置 基类 的方式导出。
也就是说 通过以下两种方式的代码 可以把 Mojo::Base 中的函数导入到目标模块中。

 use Mojo::Base -base;  
 use Mojo::Base 'SomeBaseClass';    

has 函数

has 函数 就像 attr 方法一样,为基于 HASH 结构的对象创建一个属性访问器。

## has 函数 的使用方式有如下几种

has 'name'; 
has ['name1', 'name2', 'name3']; 
has name => 'foo';
has name => sub {...};
has ['name1', 'name2', 'name3'] => 'foo';
has ['name1', 'name2', 'name3'] => sub {...};

方法

Mojo::Base 有以下方法

attr 方法

为基于 HASH 结构的对象创建属性访问器。把一个数组的引用作为属性参数可以一次创建多个属性访问器。第二个参数是可选的,用来给属性设置默认值,通常情况下它应该是一个常量或是一个回调(sub)。在没有给属性设置值的情况下读取属性的值时这个回调将会被执行。属性访问器是可以链式使用的,也就是说如果给属性访问器传数的话,它将返回调用它的对象。

## attr 方法的使用方式如下:

$object->attr('name');
SubClass->attr('name');
SubClass->attr(['name1', 'name2', 'name3']);
SubClass->attr(name => 'foo');
SubClass->attr(name => sub {...});
SubClass->attr(['name1', 'name2', 'name3'] => 'foo');
SubClass->attr(['name1', 'name2', 'name3'] => sub {...});

new 方法

这个基类提供了一个基本的基于 HASH 结构对象的构造方法。你可以使用 HASH 结构或 refhash 作为属性来创建一个对象。

my $object = SubClass->new;
my $object = SubClass->new(name => 'value');
my $object = SubClass->new({name => 'value'});

tap 方法

利用方法可链式操作的特性在对象的方法链上执行操作。目标对象将作为第一个参数传递给回调,并且同时会赋值给 $_。回调的返回值将会被忽略,取而代之的是返回目标对象本身。用这种方式,任何代码都可以作为对象的方法在方法链中执行。

# Longer version 
$object = $object->tap(sub { $_->some_method(@args) });

# Inject side effects into a method chain
$object->foo('A')->tap(sub { say $_->foo })->foo('B');

with_roles

my $new_class = SubClass->with_roles('SubClass::Role::One');
my $new_class = SubClass->with_roles('+One', '+Two');
$object       = $object->with_roles('+One', '+Two');

创建一个具有一个或多个Role::Tiny角色的新类。如果在类上调用则返回一个新类,如果在对象上调用,则将对象重新赋予新类的特性。对于在当前类名句空间后的角色(MyClass::Role::RoleName)可以使用简写的+RoleName表示角色的全称。需要注意的是,支持此功能需要安装Role::Tiny (2.000001+)。

with_role的实现如下:

sub with_roles {
  Carp::croak 'Role::Tiny 2.000001+ is required for roles' unless ROLES;
  my ($self, @roles) = @_;

  return Role::Tiny->create_class_with_roles($self,
    map { /^\+(.+)$/ ? "${self}::Role::$1" : $_ } @roles)
    unless my $class = Scalar::Util::blessed $self;

  return Role::Tiny->apply_roles_to_object($self,
    map { /^\+(.+)$/ ? "${class}::Role::$1" : $_ } @roles);
}

相关推荐

有关Perl的学习、交流与分享,请关注专题:码神之路:Perl篇

上一篇下一篇

猜你喜欢

热点阅读