summaryrefslogtreecommitdiff
path: root/lib/Enigmatic/Rotor.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Enigmatic/Rotor.pm')
-rw-r--r--lib/Enigmatic/Rotor.pm39
1 files changed, 33 insertions, 6 deletions
diff --git a/lib/Enigmatic/Rotor.pm b/lib/Enigmatic/Rotor.pm
index e0a3b97..9a88718 100644
--- a/lib/Enigmatic/Rotor.pm
+++ b/lib/Enigmatic/Rotor.pm
@@ -3,16 +3,33 @@ 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 => (
@@ -33,18 +50,28 @@ sub map {
{ isa => Letter },
);
- return $self->wiring->at($self->_apply_ring_setting($letter));
+ return $self->_real_map($letter,'wiring');
}
-sub _apply_ring_setting {
+sub inverse_map {
my $self = shift;
my ($letter) = pos_validated_list(
\@_,
{ isa => Letter },
);
- return chr(
- (ord($letter) - ord('A') + $self->ring_setting)
- % 26
- +ord('A') );
+ 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;
+# $letter = _rotate_by($letter,-$setting);$log.=$letter;
+ $log .= "}\n";warn $log;
+ return $letter;
}