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

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篇

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357

推荐阅读更多精彩内容