Mojo::Base - Minimal base class for Mojo projects
<b> status: Completed </b>
有关Perl的学习、交流与分享,请关注专题:码神之路:Perl篇
简介
Mojo::Base
是 Mojo
项目的一个最小基类
为 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篇
网友评论