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