1 2package App::Asciio ; 3 4$|++ ; 5 6use strict; 7use warnings; 8 9#------------------------------------------------------------------------------------------------------ 10 11my Readonly $SHORTCUTS = 0 ; 12my Readonly $CODE = 1 ; 13my Readonly $ARGUMENTS = 2 ; 14my Readonly $CONTEXT_MENUE_SUB = 3 ; 15my Readonly $CONTEXT_MENUE_ARGUMENTS = 4 ; 16my Readonly $NAME= 5 ; 17my Readonly $ORIGIN= 6 ; 18 19sub run_actions 20{ 21my ($self, @actions) = @_ ; 22 23my @results ; 24 25for my $action (@actions) 26 { 27 my @arguments ; 28 29 if('ARRAY' eq ref $action) 30 { 31 ($action, @arguments) = @{ $action } ; 32 } 33 34 my ($modifiers, $action_key) = $action =~ /(...)-(.*)/ ; 35 36 if(exists $self->{CURRENT_ACTIONS}{$action}) 37 { 38 if('HASH' eq ref $self->{CURRENT_ACTIONS}{$action}) 39 { 40 my $action_group_name = 41 $self->{CURRENT_ACTIONS}{$action}{GROUP_NAME} || 'unnamed action group' ; 42 43 print "using action handlers group '$action_group_name'" 44 . "[$self->{CURRENT_ACTIONS}{$action}{ORIGIN}].\n" ; 45 46 $self->{CURRENT_ACTIONS} = $self->{CURRENT_ACTIONS}{$action} ; 47 } 48 else 49 { 50 print "Handling input '$modifiers + $action_key' with action '$self->{CURRENT_ACTIONS}{$action}[$NAME]'" 51 . "[$self->{CURRENT_ACTIONS}{$action}[$ORIGIN]].\n" ; 52 53 if(defined $self->{CURRENT_ACTIONS}{$action}[$ARGUMENTS]) 54 { 55 push @results, 56 [ 57 $self->{CURRENT_ACTIONS}{$action}[$CODE]-> 58 ( 59 $self, 60 $self->{CURRENT_ACTIONS}{$action}[$ARGUMENTS], 61 @arguments 62 ) 63 ] ; 64 } 65 else 66 { 67 push @results, 68 [ 69 $self->{CURRENT_ACTIONS}{$action}[$CODE]->($self, @arguments) 70 ] ; 71 } 72 } 73 } 74 else 75 { 76 print "no handler for input '$modifiers + $action_key'.\n" ; 77 $self->{CURRENT_ACTIONS} = $self->{ACTIONS} ; 78 } 79 } 80 81return @results ; 82} 83 84#------------------------------------------------------------------------------------------------------ 85 86sub run_actions_by_name 87{ 88my ($self, @actions) = @_ ; 89my @results ; 90 91my $current_actions_by_name = $self->{ACTIONS_BY_NAME} ; 92 93for my $action (@actions) 94 { 95 my @arguments ; 96 97 if('ARRAY' eq ref $action) 98 { 99 ($action, @arguments) = @{ $action } ; 100 } 101 102 if(exists $current_actions_by_name->{$action}) 103 { 104 if('HASH' eq ref $self->{CURRENT_ACTIONS}{$action}) 105 { 106 print "using action handlers group '$action'\n" ; 107 $current_actions_by_name = $self->{CURRENT_ACTIONS}{$action} ; 108 } 109 else 110 { 111 print "running action '$action'.\n" ; 112 113 if(defined $current_actions_by_name->{$action}[$ARGUMENTS]) 114 { 115 push @results, 116 [ 117 $current_actions_by_name->{$action}[$CODE]-> 118 ( 119 $self, 120 $self->{CURRENT_ACTIONS}{$action}[$ARGUMENTS], 121 @arguments 122 ) 123 ] ; 124 } 125 else 126 { 127 push @results, 128 [ 129 $current_actions_by_name->{$action}[$CODE]->($self, @arguments) 130 ] ; 131 } 132 } 133 } 134 else 135 { 136 print "no handler for '$action'.\n" ; 137 last ; 138 } 139 } 140 141return @results ; 142} 143 144#------------------------------------------------------------------------------------------------------ 145 146sub exists_action 147{ 148my ($self, $action) = @_ ; 149 150return exists $self->{CURRENT_ACTIONS}{$action} ; 151} 152 153#------------------------------------------------------------------------------------------------------ 154 1551 ; 156