日記はScrapboxに移動しました。

Class::FluentInterface

id:secondlifeが「流れるようなインタフェイス!流れるようなインタフェイス!」とうるさいので、Perlでもやってみようと思って作ってみた。

泥酔しながらコード書いてたので、これでいいのかよくわかんない。オプションはhashref前提。

ともあれ、use base ‘Class::FluentInterface’して、__PACKAGE__->fluentiate(qw(target_method fluent_method));とかする感じ。使い方はテスト参照。

use strict;
use warnings;
use Test::More qw(no_plan);
package Test::Class::FluentInterface;
use strict;
use warnings;
use base qw(Class::FluentInterface);
__PACKAGE__->fluentiate(qw(new fluent_new));
__PACKAGE__->fluentiate(qw(baz fluent_baz));
sub new {
my ($class, $opt) = @_;
bless $opt || {}, $class;
}
sub baz {
my ($self, $arg, $opt) = @_;
($arg, $opt);
}
package main;
# Class method
isa_ok (Test::Class::FluentInterface->fluent_new, 'Class::FluentInterface::Proxy');
isa_ok (Test::Class::FluentInterface->fluent_new->foo('foo'), 'Class::FluentInterface::Proxy');
isa_ok (Test::Class::FluentInterface->fluent_new->foo('foo')->execute, 'Test::Class::FluentInterface');
my $obj = Test::Class::FluentInterface->fluent_new->foo('foo')->bar('bar')->execute;
is $obj->{foo}, 'foo';
is $obj->{bar}, 'bar';
# Instance method
isa_ok (Test::Class::FluentInterface->new->fluent_baz->hoge('hoge'), 'Class::FluentInterface::Proxy');
my ($baz, $opt) = Test::Class::FluentInterface->new->fluent_baz->hoge('hoge')->execute('baz');
is $baz, 'baz';
is $opt->{hoge}, 'hoge';

Leave a Reply

Your email address will not be published. Required fields are marked *