package Enigmatic::Rotor;
use DAKKAR::p 'class';
use Enigmatic::Types qw(WiringMap Letter RotorPos);
use MooseX::Types::Set::Object;
has wiring => (
is => 'ro',
isa => WiringMap,
coerce => 1,
);
has ring_setting => (
is => 'rw',
isa => RotorPos,
default => 0,
);
has notches => (
isa => 'Set::Object',
coerce => 1,
handles => {
has_notch_at => 'member',
},
default => sub { [] },
);
with 'Enigmatic::Role::WithWiring';
sub map {
my $self = shift;
my ($letter) = pos_validated_list(
\@_,
{ isa => Letter },
);
return $self->wiring->at($self->_apply_ring_setting($letter));
}
sub _apply_ring_setting {
my $self = shift;
my ($letter) = pos_validated_list(
\@_,
{ isa => Letter },
);
return chr(
(ord($letter) - ord('A') + $self->ring_setting)
% 26
+ord('A') );
}