Plack 代码和结构分析-Plack::Builder[译]
浏览:622次 出处信息
Plack::Builder 为中间件的开发提供了特定领域语言 domain specific language (DSL) 的风格. 它看起来就象:
usePlack::Builder; my$app1= sub{ ... }; my$app2= sub{ ... }; builder { enable "Deflater"; enable "Session", store => "File"; enable "Debug", panels => [ qw(DBITrace Memory Timer) ]; mount "/narwhale"=> $app1; mount "/unicorn" => $app2; };
它是怎么样工作的? 这有三个巧妙技巧.
技巧 #1
第一个巧妙的技巧是 builder 块.
subbuilder(&) { my$block= shift; ... }
这个 & 是函数原型. Perl 常常有一些于对传过来给函数的参数进行限制的需求. 这可以看看 perldoc perlsub 中有关 &:
“&” 需要一个匿名的子程序,其中,如果作为第一个参数传递,不需要 “sub” 的关键字或其后的顿号.
如果我试图传给 builder() 一个标量或数组或任何不是一个匿名函数的东西, 将得到一个编译时错误. 但如果我给它传递一个匿名函数, 编译器才会让事情继续下去.
技巧 #2
接下来的技巧是在 Plack::Builder 内部实现 DSL keywords 应对函数名和指定的函数.
packagePlack::Builder; usestrict; useparent qw( Exporter ); our@EXPORT= qw( builder enable enable_if mount ); ... subenable {...} subenable_if {...} submount {...} # etc
技巧 #3
还有一个有趣的想法. 注意这我们使用了 enable, enable_if, 或者 mount 在我们的 builder 块之外会出错. 这能正常是因为在 DSL 的关键字是函数的代码块引用. 默认的代码块内部是 croaks 的错误. 但在 builder 运行时, 这些旨用就会被真实代码所替换.
下面是一些简单的代码来说明它是如何工作的.
our$_enable= sub{ Carp::croak(...) }; # << 定义一个代码块引用 subenable { $_enable->(@_) } subbuilder(&) { my$block= shift; ... local$_enable= sub{...}; # << 暂时分配实际工作代码 ... my$app= $block->(); ... }
建议继续学习:
- Plack 代码和结构分析一[译] (阅读:946)
- Plack 代码和结构分析-PSGI Application Architecture[译] (阅读:612)
- Plack 代码和结构分析-plackup Architecture[译] (阅读:587)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
后一篇:Plack 代码和结构分析一[译] >>
文章信息
- 作者:扶 凯 来源: 扶凯
- 标签: Plack
- 发布时间:2015-02-26 22:20:27
建议继续学习
近3天十大热文
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [54] 图书馆的世界纪录
- [54] android 开发入门
- [54] 如何拿下简短的域名
- [52] Oracle MTS模式下 进程地址与会话信
- [52] Go Reflect 性能
- [49] 【社会化设计】自我(self)部分――欢迎区
- [48] 读书笔记-壹百度:百度十年千倍的29条法则
- [41] 程序员技术练级攻略
- [35] 视觉调整-设计师 vs. 逻辑