Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package Specification
- {
- use Moo;
- sub And
- {
- my $self = shift;
- my $spec = shift;
- return AndSpecification->new( left => $self, right => $spec );
- };
- sub Or
- {
- my $self = shift;
- my $spec = shift;
- return OrSpecification->new( left => $self, right => $spec );
- };
- sub Not
- {
- my $self = shift;
- return NotSpecification->new( specification => $self );
- }
- }
- package AndSpecification
- {
- use Moo;
- extends 'Specification';
- #
- has left => ( is => 'ro' );
- has right => ( is => 'ro' );
- sub is_satisfied_by
- {
- my $self = shift;
- my $object = shift;
- return $self->left->is_satisfied_by( $object ) && $self->right->is_satisfied_by( $object );
- }
- }
- package OrSpecification
- {
- use Moo;
- extends 'Specification';
- #
- has left => ( is => 'ro' );
- has right => ( is => 'ro' );
- sub is_satisfied_by
- {
- my $self = shift;
- my $object = shift;
- return $self->left->is_satisfied_by( $object ) || $self->right->is_satisfied_by( $object );
- }
- }
- package NotSpecification
- {
- use Moo;
- extends 'Specification';
- has specification => ( is => 'ro' );
- sub is_satisfied_by
- {
- my $self = shift;
- my $object = shift;
- return !$self->specification->is_satisfied_by( $object );
- }
- }
- package RAMSpecification
- {
- use Moo;
- extends 'Specification';
- sub is_satisfied_by
- {
- my $self = shift;
- my $car = shift;
- return $car->make_id == 7777 ? 1 : 0
- }
- }
- package MY21Specification
- {
- use Moo;
- extends 'Specification';
- sub is_satisfied_by
- {
- my $self = shift;
- my $car = shift;
- return $car->model_year == 2021 ? 1 : 0
- }
- }
- package isSoldSpecification
- {
- use Moo;
- extends 'Specification';
- sub is_satisfied_by
- {
- my $self = shift;
- my $car = shift;
- return $car->is_sold ? 1 : 0;
- }
- }
- package Car
- {
- use Moo;
- has make_id => ( is => 'ro' );
- has model_year => ( is => 'ro' );
- has color => ( is => 'ro' );
- has is_sold => ( is => 'ro' ); # => (is => 'ro');
- }
- my $car = Car->new( make_id => 7777, model_year => 2021, color => 'Green', is_sold => 1 );
- my $ram_spec = RAMSpecification->new();
- my $my21_spec = MY21Specification->new();
- my $is_sold = isSoldSpecification->new();
- my $spec = $ram_spec-> # Model RAM
- And( $my21_spec )-> # Model Year 2021
- Not( $is_sold ); # is not sold
- my $is_valid = $spec->is_satisfied_by( $car );
- say STDERR $is_valid ? 'Valid' : 'Not Valid';
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement