package Venus::Role::Matchable;
use 5.018;
use strict;
use warnings;
use Venus::Role 'with';
# METHODS
sub match {
my ($self, $method, @args) = @_;
require Venus::Match;
local $_ = $self;
my $match = Venus::Match->new($method ? scalar($self->$method(@args)) : $self);
return $match;
}
# EXPORTS
sub EXPORT {
['match']
}
1;
=head1 NAME
Venus::Role::Matchable - Matchable Role
=cut
=head1 ABSTRACT
Matchable Role for Perl 5
=cut
=head1 SYNOPSIS
package Example;
use Venus::Class;
with 'Venus::Role::Matchable';
attr 'active';
sub validate {
my ($self) = @_;
return $self->match->when('active')->then(true)->none(false);
}
package main;
my $example = Example->new;
# $example->validate->result;
# 0
=cut
=head1 DESCRIPTION
This package modifies the consuming package and provides a mechanism for
assembling complex pattern matching operations.
=cut
=head1 METHODS
This package provides the following methods:
=cut
=head2 match
match(Str | CodeRef $method, Any @args) (Match)
The match method returns a L<Venus::Match> object having the match value set to
the invocant or the result of a dispatch. This method supports dispatching,
i.e. providing a method name and arguments whose return value will be acted on
by this method.
I<Since C<0.04>>
=over 4
=item match example 1
package main;
my $example = Example->new;
my $match = $example->match;
# bless({..., value => bless(..., 'Example')}, 'Venus::Match')
=back
=over 4
=item match example 2
package main;
my $example = Example->new;
my $match = $example->match('active');
# bless({..., value => undef}, 'Venus::Match')
=back
=over 4
=item match example 3
package main;
my $example = Example->new(active => 1);
my $match = $example->match('active');
# bless({..., value => 1}, 'Venus::Match')
=back
=cut