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; $letter = _rotate_by($letter,-$setting); $letter = $self->$wiring->at($letter); $letter = _rotate_by($letter,$setting); return $letter; } __END__ =head1 AUTHOR Gianni Ceccarelli =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011 by Gianni Ceccarelli. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3. =cut