package Enigmatic::Rotor;
use DAKKAR::p 'class';
use Enigmatic::Types qw(WiringMap Letter RotorPos);
use MooseX::Types::Set::Object;
with 'Enigmatic::Role::Rotate';
has wiring => (
is => 'ro',
isa => WiringMap,
coerce => 1,
);
has inverse_wiring => (
is => 'ro',
isa => WiringMap,
init_arg => undef,
lazy_build => 1,
);
sub _build_inverse_wiring {
my ($self) = @_;
my $w = $self->wiring;
my $ret = { reverse %$w };
return $ret;
}
has ring_setting => (
is => 'rw',
isa => RotorPos,
default => 0,
coerce => 1,
);
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->_real_map($letter,'wiring');
}
sub inverse_map {
my $self = shift;
my ($letter) = pos_validated_list(
\@_,
{ isa => Letter },
);
return $self->_real_map($letter,'inverse_wiring');
}
sub _real_map {
my ($self,$letter,$wiring) = @_;
my $setting = $self->ring_setting;
my $log = "{$letter";
$letter = _rotate_by($letter,$setting);$log.=$letter;
$letter = $self->$wiring->at($letter);$log.=$letter;
$log .= "}\n";warn $log;
return $letter;
}