The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Reaction::UI::ViewPort::Field::Mutable::MatchingPasswords;

use Reaction::Class;
use namespace::clean -except => [ qw(meta) ];
use MooseX::Types::Moose qw/Str/;

extends 'Reaction::UI::ViewPort::Field::Mutable::Password';

has check_value => (is => 'rw', isa => Str, );
has check_label => (is => 'rw', isa => Str, lazy_build => 1);

sub _build_check_label {
  my $orig_label = shift->label;
  return "Confirm ${orig_label}";
}

#maybe both check_value and value_string should have triggers ?
#that way if one even happens before the other it would still work?
around adopt_value_string => sub {
  my $orig = shift;
  my ($self) = @_;
  return $orig->(@_) if $self->check_value eq $self->value_string;
  $self->message("Passwords do not match");
  return;
};

#order is important check_value should happen before value here ...
#i don't like how this works, it's unnecessarily fragile, but how else ?
around accept_events => sub { ('check_value', shift->(@_)) };

around can_sync_to_action => sub {
  my $orig = shift;
  my ($self) = @_;
  return $orig->(@_) if $self->check_value eq $self->value_string;
  $self->message("Passwords do not match");
  return;
};

__PACKAGE__->meta->make_immutable;

1;

__END__;