From 6a0022d67d4baea240897c7e3b24d2b864f06c60 Mon Sep 17 00:00:00 2001 From: dakkar Date: Mon, 29 Aug 2011 18:15:22 +0100 Subject: more stepping tests --- lib/Enigmatic/Rotor.pm | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) (limited to 'lib/Enigmatic/Rotor.pm') 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; } -- cgit v1.2.3