File Coverage

blib/lib/Goo/Profile.pm
Criterion Covered Total %
statement 24 79 30.3
branch 0 10 0.0
condition 0 3 0.0
subroutine 8 22 36.3
pod 14 14 100.0
total 46 128 35.9


line stmt bran cond sub pod time code
1             package Goo::Profile;
2              
3             ###############################################################################
4             # Nigel Hamilton
5             #
6             # Copyright Nigel Hamilton 2005
7             # All Rights Reserved
8             #
9             # Author: Nigel Hamilton
10             # Filename: Goo::Profile.pm
11             # Description: Show a profile for a Thing
12             #
13             # Date Change
14             # -----------------------------------------------------------------------------
15             # 04/10/2005 Auto generated file
16             # 04/10/2005 Needed a model that could be used across all profilers
17             # 06/10/2005 Added method: clear
18             # 08/10/2005 Added method: addOption
19             # 08/10/2005 Added method: addTable
20             # 08/10/2005 Added method: addDescription
21             # 09/10/2005 Added method: showMessage
22             #
23             ###############################################################################
24              
25 1     1   7 use strict;
  1         3  
  1         37  
26              
27 1     1   6 use Goo::Object;
  1         4  
  1         27  
28 1     1   532 use Goo::Header;
  1         3  
  1         28  
29 1     1   6 use Goo::Prompter;
  1         3  
  1         19  
30 1     1   516 use Goo::ThingFinder;
  1         4  
  1         28  
31 1     1   515 use Goo::OptionIndexTable;
  1         3  
  1         26  
32 1     1   7 use Text::FormatTable;
  1         2  
  1         23  
33              
34 1     1   5 use base qw(Goo::Object);
  1         2  
  1         1142  
35              
36             # use Smart::Comments;
37              
38              
39             ###############################################################################
40             #
41             # new - construct a profile object
42             #
43             ###############################################################################
44              
45             sub new {
46              
47 0     0 1   my ($class, $thing) = @_;
48              
49 0           my $this = $class->SUPER::new();
50              
51 0           $this->{thing} = $thing;
52              
53             ### keep an index counter
54 0           $this->{index_counter} = [ "a" .. "z", 0 .. 9 ];
55              
56             ### keep all option in an index
57 0           $this->{index} = {};
58              
59 0           $this->{option_tables} = "";
60              
61             ### get the commands for this Thing
62 0           $this->{command_string} = join(', ', $thing->get_commands());
63              
64 0           return $this;
65              
66             }
67              
68              
69             ###############################################################################
70             #
71             # get_next_index_key - grab the next key in the index
72             #
73             ###############################################################################
74              
75             sub get_next_index_key {
76              
77 0     0 1   my ($this) = @_;
78              
79             # what index position are we up to in the Profile?
80 0           return shift(@{ $this->{index_counter} });
  0            
81              
82             }
83              
84              
85             ###############################################################################
86             #
87             # add_options_table - add a table of options for display
88             #
89             ###############################################################################
90              
91             sub add_options_table {
92              
93 0     0 1   my ($this, $title, $columns, $option_type, @list) = @_;
94              
95             # add a new table of options to the profile
96 0           my $index_table = {};
97              
98             # add each sub_thing to the index
99 0           foreach my $option_text (@list) {
100              
101 0           my $current_index = $this->get_next_index_key();
102 0           $index_table->{$current_index} = $option_text;
103              
104             # print "Option_type: $option_type\n";
105 0           $this->add_option($current_index, $option_text, $option_type);
106              
107             }
108              
109 0           $this->add_rendered_table(Goo::OptionIndexTable::make($title, $columns, $index_table));
110              
111             }
112              
113              
114             ###############################################################################
115             #
116             # add_things_table - find a list of sub-things in a thing
117             #
118             ###############################################################################
119              
120             sub add_things_table {
121              
122 0     0 1   my ($this, $thing_string) = @_;
123              
124             # extract Things from a string or the Thing itself
125 0   0       $thing_string = $thing_string || $this->{thing}->get_file();
126              
127             #use Goo::Prompter;
128             #Goo::Prompter::notify("about to start looking for Things ... ");
129              
130             # add a table of Things to the profile
131 0           $this->add_options_table("Things", 4, "Goo::ThingProfileOption",
132             Goo::ThingFinder::get_things($thing_string));
133              
134             }
135              
136              
137             ###############################################################################
138             #
139             # show_header - show the header for the profile
140             #
141             ###############################################################################
142              
143             sub show_header {
144              
145 0     0 1   my ($this, $action, $filename, $location) = @_;
146              
147             # $this->{called_by} = $this->{called_by} || caller();
148 0           Goo::Header::show($action, $filename, $location);
149              
150             #Goo::Prompter::show_detailed_header("testing1" || caller(),
151             # "testing2" || $this->{thing}->{filename},
152             # "testing3" || $this->{thing}->{location}
153             # );
154             #Goo::Prompter::say($this->{description} || $this->{thing}->{description});
155 0           Goo::Prompter::say();
156              
157             }
158              
159              
160             ###############################################################################
161             #
162             # display - show the profile
163             #
164             ###############################################################################
165              
166             sub display {
167              
168 0     0 1   my ($this) = @_;
169              
170             # print out all the tables
171 0           print $this->{option_tables};
172              
173             }
174              
175              
176             ###############################################################################
177             #
178             # get_command - show the profile
179             #
180             ###############################################################################
181              
182             sub get_command {
183              
184 0     0 1   my ($this) = @_;
185              
186             #print $this->{command_string};
187 0           my $option_key = Goo::Prompter::pick_command($this->{command_string});
188              
189             # if this is a lowercase option or a number
190             # this must be an option in the profile
191 0 0         if ($option_key =~ /[a-z0-9]/) {
    0          
192              
193             ### lookup the index
194 0           my $option = $this->{index}->{$option_key};
195 0 0         next unless $option;
196              
197             ### do the action
198 0           $option->do($this->{thing});
199              
200             } elsif ($option_key =~ /[A-Z]/) {
201              
202             ### it may be an uppercase command?
203 0 0         if ($this->{thing}->can_do_action($option_key)) {
204 0           $this->{thing}->do_action($option_key);
205             }
206              
207             } else {
208              
209 0           Goo::Prompter::notify("Invalid option. Press a key.");
210              
211             }
212              
213             }
214              
215              
216             ###############################################################################
217             #
218             # clear - clear the profile
219             #
220             ###############################################################################
221              
222             sub clear {
223              
224 0     0 1   my ($this) = @_;
225              
226             ### repopulate the index counter
227 0           $this->{index_counter} = [ "a" .. "z", 0 .. 9 ];
228              
229             ### clear the option index
230 0           $this->{index} = {};
231              
232 0           $this->{option_tables} = "";
233              
234             }
235              
236              
237             ###############################################################################
238             #
239             # add_option - add an individual option to the profile
240             #
241             ###############################################################################
242              
243             sub add_option {
244              
245 0     0 1   my ($this, $index_key, $option_text, $option_type) = @_;
246              
247             # load the option type - hmmm - from where though?
248             # this could be a problem -
249 0           eval "use $option_type;";
250              
251             # did the require work?
252 0 0         if ($@) { die("Failed to require $option_type: $@"); }
  0            
253              
254             # add a new option to the index
255 0           $this->{index}->{$index_key} =
256             $option_type->new(
257             { thing => $this->{thing},
258             text => $option_text
259             }
260             );
261              
262              
263             }
264              
265              
266             ###############################################################################
267             #
268             # add_rendered_table - add a fully rendered table to the profile
269             #
270             ###############################################################################
271              
272             sub add_rendered_table {
273              
274 0     0 1   my ($this, $rendered_table) = @_;
275              
276 0           $this->{option_tables} .= $rendered_table;
277 0           $this->{option_tables} .= "\n";
278              
279              
280             }
281              
282              
283             ###############################################################################
284             #
285             # set_description - add a description to this profile
286             #
287             ###############################################################################
288              
289             sub set_description {
290              
291 0     0 1   my ($this, $description) = @_;
292              
293 0           $this->{description} = $description;
294              
295             }
296              
297              
298             ###############################################################################
299             #
300             # set_filename - add a filename to this profile
301             #
302             ###############################################################################
303              
304             sub set_filename {
305              
306 0     0 1   my ($this, $filename) = @_;
307              
308 0           $this->{filename} = $filename;
309              
310             }
311              
312              
313             ###############################################################################
314             #
315             # set_location - add a filename to this profile
316             #
317             ###############################################################################
318              
319             sub set_location {
320              
321 0     0 1   my ($this, $location) = @_;
322              
323 0           $this->{location} = $location;
324              
325             }
326              
327              
328             ###############################################################################
329             #
330             # show_message - display a message in the profile
331             #
332             ###############################################################################
333              
334             sub show_message {
335              
336 0     0 1   my ($this, $message) = @_;
337              
338 0           Goo::Prompter::say($message);
339              
340             }
341              
342             1;
343              
344              
345             __END__
346              
347             =head1 NAME
348              
349             Goo::Profile - Show a profile for a Thing
350              
351             =head1 SYNOPSIS
352              
353             use Goo::Profile;
354              
355             =head1 DESCRIPTION
356              
357              
358              
359             =head1 METHODS
360              
361             =over
362              
363             =item new
364              
365             construct a profile object
366              
367             =item get_next_index_key
368              
369             grab the next key in the index
370              
371             =item add_options_table
372              
373             add a table of options for display
374              
375             =item add_things_table
376              
377             find a list of sub-things in a thing
378              
379             =item show_header
380              
381             show the header for the profile
382              
383             =item display
384              
385             show the profile
386              
387             =item get_command
388              
389             show the profile
390              
391             =item clear
392              
393             clear the profile
394              
395             =item add_option
396              
397             add an individual option to the profile
398              
399             =item add_rendered_table
400              
401             add a fully rendered table to the profile
402              
403             =item set_description
404              
405             add a description to this profile
406              
407             =item set_filename
408              
409             add a filename to this profile
410              
411             =item set_location
412              
413             add a filename to this profile
414              
415             =item show_message
416              
417             display a message in the profile
418              
419              
420             =back
421              
422             =head1 AUTHOR
423              
424             Nigel Hamilton <nigel@trexy.com>
425              
426             =head1 SEE ALSO
427