Condition.pm 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package SugarTrail::Template::Condition;
  2. # condition
  3. # new()
  4. # parse(string)
  5. # match(data)
  6. use strict;
  7. use warnings;
  8. sub _equals {
  9. my $a = shift;
  10. my $b = $_[0]->[0];
  11. return $a eq $b;
  12. }
  13. sub new {
  14. my $class = shift;
  15. my $self = {};
  16. $self->{string} = shift;
  17. $self->{handlers} = {
  18. '==' => \&_equals,
  19. '>=' => \&_greater_or_eq,
  20. '<=' => \&_less_or_eq,
  21. '=@' => \&_in,
  22. '=~' => \&_regex,
  23. };
  24. $self->{parsed} = 0;
  25. return bless $self, $class;
  26. }
  27. # parse condition from its string version
  28. sub parse {
  29. my $self = shift;
  30. my $string = $self->{string};
  31. return if $self->{parsed};
  32. # cut spaces
  33. $string =~ s/^\s+//;
  34. $string =~ s/\s+$//;
  35. # get name, operator, value(s)
  36. my ($n, $o, $v) = $string =~ m/([a-zA-Z0-9_ ]+)([<>=~+\-*@]*)(.*)/;
  37. return unless $n;
  38. # cut inner spaces
  39. $n =~ s/\s+$//;
  40. $o =~ s/\s+$//;
  41. $o =~ s/^\s+//;
  42. $v =~ s/\s+$//;
  43. # split vlues
  44. my @v = split m/\s*,\s*/, $v;
  45. # assign
  46. $self->{n} = $n;
  47. $self->{o} = $o;
  48. $self->{v} = \@v;
  49. $self->{parsed}++;
  50. }
  51. # match the cond against params
  52. sub match {
  53. my $self = shift;
  54. my $params = shift;
  55. $self->parse();
  56. my $name = $self->{n}; # what is the topic
  57. my $op = $self->{o}; # what op to use
  58. my $have = $self->{v}; # what we have in this step
  59. my $want = $params->{$name}; # what they want
  60. # execute the right handler
  61. return &{ $self->{handlers}->{$op} }($want, $have);
  62. }
  63. 1;