Advertisement
Guest User

Untitled

a guest
Jan 3rd, 2021
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 2.38 KB | None | 0 0
  1. package Specification
  2. {
  3.     use Moo;
  4.  
  5.     sub And
  6.     {
  7.         my $self = shift;
  8.         my $spec = shift;
  9.         return AndSpecification->new( left => $self, right => $spec );
  10.     };
  11.     sub Or
  12.     {
  13.         my $self = shift;
  14.         my $spec = shift;
  15.         return OrSpecification->new( left => $self, right => $spec );
  16.     };
  17.     sub Not
  18.     {
  19.         my $self = shift;
  20.         return NotSpecification->new( specification => $self );
  21.  
  22.     }
  23. }
  24.  
  25. package AndSpecification
  26. {
  27.     use Moo;
  28.     extends 'Specification';
  29.     #
  30.     has left => ( is => 'ro' );
  31.     has right => ( is => 'ro' );
  32.  
  33.     sub is_satisfied_by
  34.     {
  35.         my $self = shift;
  36.         my $object = shift;
  37.  
  38.         return $self->left->is_satisfied_by( $object ) && $self->right->is_satisfied_by( $object );
  39.     }
  40. }
  41. package OrSpecification
  42. {
  43.     use Moo;
  44.     extends 'Specification';
  45.  
  46.     #
  47.     has left => ( is => 'ro' );
  48.     has right => ( is => 'ro' );
  49.     sub is_satisfied_by
  50.     {
  51.         my $self = shift;
  52.         my $object = shift;
  53.  
  54.         return $self->left->is_satisfied_by( $object ) || $self->right->is_satisfied_by( $object );
  55.     }
  56. }
  57. package NotSpecification
  58. {
  59.     use Moo;
  60.     extends 'Specification';
  61.  
  62.     has specification => ( is => 'ro' );
  63.  
  64.     sub is_satisfied_by
  65.     {
  66.         my $self = shift;
  67.         my $object = shift;
  68.         return !$self->specification->is_satisfied_by( $object );
  69.     }
  70. }
  71.  
  72. package RAMSpecification
  73. {
  74.     use Moo;
  75.     extends 'Specification';
  76.  
  77.     sub is_satisfied_by
  78.     {
  79.         my $self = shift;
  80.         my $car = shift;
  81.         return $car->make_id == 7777 ? 1 : 0
  82.     }
  83. }
  84. package MY21Specification
  85. {
  86.     use Moo;
  87.     extends 'Specification';
  88.  
  89.     sub is_satisfied_by
  90.     {
  91.         my $self = shift;
  92.         my $car = shift;
  93.         return $car->model_year == 2021 ? 1 : 0
  94.     }
  95.  
  96. }
  97. package isSoldSpecification
  98. {
  99.     use Moo;
  100.     extends 'Specification';
  101.  
  102.     sub is_satisfied_by
  103.     {
  104.         my $self = shift;
  105.         my $car = shift;
  106.         return $car->is_sold ? 1 : 0;
  107.     }
  108. }
  109.  
  110. package Car
  111. {
  112.     use Moo;
  113.  
  114.     has make_id => ( is => 'ro' );
  115.     has model_year => ( is => 'ro' );
  116.     has color => ( is => 'ro' );
  117.     has is_sold => ( is => 'ro' ); #       => (is => 'ro');
  118. }
  119.  
  120. my $car = Car->new( make_id => 7777, model_year => 2021, color => 'Green', is_sold => 1 );
  121. my $ram_spec = RAMSpecification->new();
  122. my $my21_spec = MY21Specification->new();
  123. my $is_sold = isSoldSpecification->new();
  124.  
  125. my $spec = $ram_spec->  # Model RAM
  126.     And( $my21_spec )-> # Model Year 2021
  127.     Not( $is_sold );    # is not sold
  128. my $is_valid = $spec->is_satisfied_by( $car );
  129.  
  130. say STDERR $is_valid ? 'Valid' : 'Not Valid';
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement