File Coverage

blib/lib/Labyrinth.pm
Criterion Covered Total %
statement 13 15 86.6
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 18 20 90.0


line stmt bran cond sub pod time code
1             package Labyrinth;
2              
3 6     6   90467 use warnings;
  6         11  
  6         175  
4 6     6   21 use strict;
  6         6  
  6         249  
5              
6             our $VERSION = '5.31';
7              
8             =head1 NAME
9              
10             Labyrinth - An extensible website in a box.
11              
12             =head1 SYNOPSIS
13              
14             use Labyrinth;
15             my $labyrinth = Labyrinth->new();
16             $labyrinth->run();
17              
18             =head1 DESCRIPTION
19              
20             Documentation overview for Labyrinth.
21              
22             Labyrinth began life in 2002, with a small set of plugins to enable various
23             features of web site management. The core set of plugins are now available as
24             the Labyrinth-Plugin-Core package, with this package providing the core
25             functionality that drives the Labyrinth framework system.
26              
27             See the individual files for more details on how to use them.
28              
29             =cut
30              
31             # -------------------------------------
32             # Library Modules
33              
34 6     6   2603 use Module::Pluggable search_path => ['Labyrinth::Plugin'];
  6         42349  
  6         35  
35              
36             # Required Core
37 6     6   2407 use Labyrinth::Audit;
  6         11  
  6         760  
38 6     6   2094 use Labyrinth::DTUtils;
  0            
  0            
39             use Labyrinth::Globals qw(:all);
40             use Labyrinth::Mailer;
41             use Labyrinth::Plugins;
42             use Labyrinth::Request;
43             use Labyrinth::Session;
44             use Labyrinth::Support;
45             use Labyrinth::Writer;
46             use Labyrinth::Variables;
47              
48             # -------------------------------------
49             # Variables
50              
51             my %plugins;
52              
53             # -------------------------------------
54             # The Program
55              
56             =head1 FUNCTIONS
57              
58             =head2 Constructor
59              
60             =over 4
61              
62             =item new()
63              
64             Instantiates the Labyrinth object.
65              
66             =back
67              
68             =cut
69              
70             sub new {
71             my $self = shift;
72              
73             # create an attributes hash
74             my $atts = {};
75              
76             # create the object
77             bless $atts, $self;
78             return $atts;
79             }
80              
81             =head2 Methods
82              
83             =over 4
84              
85             =item run()
86              
87             Provides the dispatch loop, instantiating any configuration required, then
88             processes each command in turn, before finally publishing the result.
89              
90             =cut
91              
92             sub run {
93             my ($self,$file,%hash) = @_;
94             my ($user,$realm,$command,$request);
95              
96             my $LAYOUT = 'public/layout.html';
97             my $default_realm = 'public';
98             $default_realm = $hash{realm} if(%hash && $hash{realm});
99              
100             $tvars{errcode} = '';
101              
102             eval {
103             Labyrinth::Variables::init(); # initial standard variable values
104              
105             UnPublish(); # Start a fresh slate
106             LoadSettings($file); # Load All Global Settings
107              
108             eval "use Labyrinth::Paths";
109             unless($@) {
110             my $paths = Labyrinth::Paths->new();
111             $paths->parse();
112             }
113              
114             die $tvars{errmess} if($tvars{errcode} && $tvars{errcode} eq 'ERROR');
115              
116             MailSet(mailsend => $settings{mailsend}, logdir => $settings{logdir});
117              
118             DBConnect();
119             ParseParams();
120              
121             ## defaults in the event of errors
122             $tvars{layout} = $LAYOUT;
123             $tvars{content} = '';
124              
125             ## session validation & the request
126             $user = ValidSession();
127             $realm = $user ? $user->realm : $default_realm;
128             $command = $cgiparams{act};
129             $request = Labyrinth::Request->new($realm,$command);
130             $tvars{realm} = $realm;
131              
132             $self->load;
133             };
134              
135             die "Cannot start Labyrinth: $@\n" if($@);
136              
137             ## 1. each request is only the start.
138             ## 2. upon success or failure it is possible other commands will follow.
139             ## 3. the content for each command can be different.
140             ## 4. if errcode is set, we check if a failure command is required first.
141             ## 5. if no more commands we publish.
142              
143             do {
144             $tvars{errcode} = undef;
145              
146             while(my $action = $request->next_action) {
147             LogDebug("run: action=$action");
148             $self->action($action);
149              
150             if($tvars{errcode} && $tvars{errcode} eq 'NEXT') {
151             $tvars{errcode} = undef;
152             $command = $tvars{command};
153             while($request->next_action) {} # ignore remaining actions
154             $request->reset_request($command) if($command);
155             #if($tvars{redirect}) {
156             # Publish();
157             # return;
158             #}
159             }
160              
161             $realm ||= '';
162             $tvars{realm} ||= '';
163              
164             if($realm ne $tvars{realm} ) { # just in case of a login/logout
165             $realm = $tvars{realm};
166             $request->reset_realm($tvars{realm});
167             }
168              
169             last if $tvars{errcode};
170             }
171              
172             LogDebug("run: 1.errcode=".($tvars{errcode} || 'undef'));
173              
174             if(!defined $tvars{errcode}) { $command = $request->onsuccess }
175             elsif($tvars{errcode} eq 'NEXT') { $command = $tvars{command} }
176             elsif($tvars{errcode} eq 'ERROR') { $command = $request->onerror }
177             elsif($tvars{errcode} eq 'FAIL') { $command = $request->onfailure }
178             elsif($tvars{errcode}) { $command = 'error-' . lc($tvars{errcode}) }
179             else { $command = $request->onsuccess }
180              
181             LogDebug("run: command=".($command || 'undef'));
182              
183             if($command) { $request->reset_request($command) }
184             else { $command = undef }
185              
186             #if($tvars{redirect}) {
187             # Publish();
188             # return;
189             #}
190             } while($command);
191              
192             # just in case some joker has tried to access the realm directly
193             $request->reset_realm($tvars{realm});
194              
195             foreach my $field (qw(layout content)) {
196             my $value = $request->$field();
197             $tvars{$field} = $value if($value);
198             }
199             LogDebug("run: layout=$tvars{layout}");
200             LogDebug("run: content=$tvars{content}");
201             LogDebug("run: loggedin=$tvars{loggedin}");
202              
203             return Publish();
204             }
205              
206             =item load()
207              
208             Loads plugins found within the plugin directory.
209              
210             =item action($action)
211              
212             Calls the appropriate plugin method.
213              
214             =back
215              
216             =cut
217              
218             sub load {
219             my $self = shift;
220             load_plugins($self->plugins());
221             }
222              
223             sub action {
224             my ($self,$action) = @_;
225             my ($class,$method) = ($action =~ /(.*)::(.*)/);
226             $class = ($class =~ /^Labyrinth/ ? $class : 'Labyrinth::Plugin::' . $class);
227              
228             if(my $plugin = get_plugin($class)) {
229             eval { $plugin->$method(); };
230              
231             # this may fail at the moment, as not all requests have an onerror entry.
232             # as such a default (badcommand?) may need to be set.
233              
234             if($@) {
235             $tvars{errcode} = 'ERROR';
236             LogError("action: class=$class, method=$method, FAULT: $@");
237             }
238             } else {
239             $tvars{errcode} = 'MESSAGE';
240             LogError("action: class=$class, method=$method, FAULT: class not loaded");
241             }
242             }
243              
244             1;
245              
246             __END__