Add built local::lib
[catagits/Gitalist.git] / local-lib5 / man / man3 / Template::Plugin.3pm
CommitLineData
3fea05b9 1.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.3
2.\"
3.\" Standard preamble:
4.\" ========================================================================
5.de Sh \" Subsection heading
6.br
7.if t .Sp
8.ne 5
9.PP
10\fB\\$1\fR
11.PP
12..
13.de Sp \" Vertical space (when we can't use .PP)
14.if t .sp .5v
15.if n .sp
16..
17.de Vb \" Begin verbatim text
18.ft CW
19.nf
20.ne \\$1
21..
22.de Ve \" End verbatim text
23.ft R
24.fi
25..
26.\" Set up some character translations and predefined strings. \*(-- will
27.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
28.\" double quote, and \*(R" will give a right double quote. | will give a
29.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to
30.\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C'
31.\" expand to `' in nroff, nothing in troff, for use with C<>.
32.tr \(*W-|\(bv\*(Tr
33.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
34.ie n \{\
35. ds -- \(*W-
36. ds PI pi
37. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
38. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
39. ds L" ""
40. ds R" ""
41. ds C` ""
42. ds C' ""
43'br\}
44.el\{\
45. ds -- \|\(em\|
46. ds PI \(*p
47. ds L" ``
48. ds R" ''
49'br\}
50.\"
51.\" If the F register is turned on, we'll generate index entries on stderr for
52.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
53.\" entries marked with X<> in POD. Of course, you'll have to process the
54.\" output yourself in some meaningful fashion.
55.if \nF \{\
56. de IX
57. tm Index:\\$1\t\\n%\t"\\$2"
58..
59. nr % 0
60. rr F
61.\}
62.\"
63.\" For nroff, turn off justification. Always turn off hyphenation; it makes
64.\" way too many mistakes in technical documents.
65.hy 0
66.if n .na
67.\"
68.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
69.\" Fear. Run. Save yourself. No user-serviceable parts.
70. \" fudge factors for nroff and troff
71.if n \{\
72. ds #H 0
73. ds #V .8m
74. ds #F .3m
75. ds #[ \f1
76. ds #] \fP
77.\}
78.if t \{\
79. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
80. ds #V .6m
81. ds #F 0
82. ds #[ \&
83. ds #] \&
84.\}
85. \" simple accents for nroff and troff
86.if n \{\
87. ds ' \&
88. ds ` \&
89. ds ^ \&
90. ds , \&
91. ds ~ ~
92. ds /
93.\}
94.if t \{\
95. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
96. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
97. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
98. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
99. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
100. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
101.\}
102. \" troff and (daisy-wheel) nroff accents
103.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
104.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
105.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
106.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
107.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
108.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
109.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
110.ds ae a\h'-(\w'a'u*4/10)'e
111.ds Ae A\h'-(\w'A'u*4/10)'E
112. \" corrections for vroff
113.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
114.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
115. \" for low resolution devices (crt and lpr)
116.if \n(.H>23 .if \n(.V>19 \
117\{\
118. ds : e
119. ds 8 ss
120. ds o a
121. ds d- d\h'-1'\(ga
122. ds D- D\h'-1'\(hy
123. ds th \o'bp'
124. ds Th \o'LP'
125. ds ae ae
126. ds Ae AE
127.\}
128.rm #[ #] #H #V #F C
129.\" ========================================================================
130.\"
131.IX Title "Template::Plugin 3"
132.TH Template::Plugin 3 "2008-11-13" "perl v5.8.7" "User Contributed Perl Documentation"
133.SH "NAME"
134Template::Plugin \- Base class for Template Toolkit plugins
135.SH "SYNOPSIS"
136.IX Header "SYNOPSIS"
137.Vb 4
138\& package MyOrg::Template::Plugin::MyPlugin;
139\& use base qw( Template::Plugin );
140\& use Template::Plugin;
141\& use MyModule;
142.Ve
143.PP
144.Vb 7
145\& sub new {
146\& my $class = shift;
147\& my $context = shift;
148\& bless {
149\& ...
150\& }, $class;
151\& }
152.Ve
153.SH "DESCRIPTION"
154.IX Header "DESCRIPTION"
155A \*(L"plugin\*(R" for the Template Toolkit is simply a Perl module which
156exists in a known package location (e.g. \f(CW\*(C`Template::Plugin::*\*(C'\fR) and
157conforms to a regular standard, allowing it to be loaded and used
158automatically.
159.PP
160The \f(CW\*(C`Template::Plugin\*(C'\fR module defines a base class from which other
161plugin modules can be derived. A plugin does not have to be derived
162from Template::Plugin but should at least conform to its object-oriented
163interface.
164.PP
165It is recommended that you create plugins in your own package namespace
166to avoid conflict with toolkit plugins. e.g.
167.PP
168.Vb 1
169\& package MyOrg::Template::Plugin::FooBar;
170.Ve
171.PP
172Use the \s-1PLUGIN_BASE\s0 option to specify
173the namespace that you use. e.g.
174.PP
175.Vb 4
176\& use Template;
177\& my $template = Template\->new({
178\& PLUGIN_BASE => 'MyOrg::Template::Plugin',
179\& });
180.Ve
181.SH "METHODS"
182.IX Header "METHODS"
183The following methods form the basic interface between the Template
184Toolkit and plugin modules.
185.Sh "load($context)"
186.IX Subsection "load($context)"
187This method is called by the Template Toolkit when the plugin module
188is first loaded. It is called as a package method and thus implicitly
189receives the package name as the first parameter. A reference to the
190Template::Context object loading the plugin is also passed. The
191default behaviour for the \f(CW\*(C`load()\*(C'\fR method is to simply return the class
192name. The calling context then uses this class name to call the \f(CW\*(C`new()\*(C'\fR
193package method.
194.PP
195.Vb 1
196\& package MyPlugin;
197.Ve
198.PP
199.Vb 4
200\& sub load { # called as MyPlugin\->load($context)
201\& my ($class, $context) = @_;
202\& return $class; # returns 'MyPlugin'
203\& }
204.Ve
205.ie n .Sh "new($context, @params)"
206.el .Sh "new($context, \f(CW@params\fP)"
207.IX Subsection "new($context, @params)"
208This method is called to instantiate a new plugin object for the \f(CW\*(C`USE\*(C'\fR
209directive. It is called as a package method against the class name returned by
210\&\fIload()\fR. A reference to the Template::Context object creating the plugin
211is passed, along with any additional parameters specified in the \f(CW\*(C`USE\*(C'\fR
212directive.
213.PP
214.Vb 6
215\& sub new { # called as MyPlugin\->new($context)
216\& my ($class, $context, @params) = @_;
217\& bless {
218\& _CONTEXT => $context,
219\& }, $class; # returns blessed MyPlugin object
220\& }
221.Ve
222.Sh "error($error)"
223.IX Subsection "error($error)"
224This method, inherited from the Template::Base module, is used for
225reporting and returning errors. It can be called as a package method
226to set/return the \f(CW$ERROR\fR package variable, or as an object method to
227set/return the object \f(CW\*(C`_ERROR\*(C'\fR member. When called with an argument, it
228sets the relevant variable and returns \f(CW\*(C`undef.\*(C'\fR When called without an
229argument, it returns the value of the variable.
230.PP
231.Vb 2
232\& package MyPlugin;
233\& use base 'Template::Plugin';
234.Ve
235.PP
236.Vb 2
237\& sub new {
238\& my ($class, $context, $dsn) = @_;
239.Ve
240.PP
241.Vb 2
242\& return $class\->error('No data source specified')
243\& unless $dsn;
244.Ve
245.PP
246.Vb 4
247\& bless {
248\& _DSN => $dsn,
249\& }, $class;
250\& }
251.Ve
252.PP
253.Vb 1
254\& package main;
255.Ve
256.PP
257.Vb 2
258\& my $something = MyPlugin\->new()
259\& || die MyPlugin\->error(), "\en";
260.Ve
261.PP
262.Vb 2
263\& $something\->do_something()
264\& || die $something\->error(), "\en";
265.Ve
266.SH "DEEPER MAGIC"
267.IX Header "DEEPER MAGIC"
268The Template::Context object that handles the loading and use of plugins
269calls the \fInew()\fR and \fIerror()\fR methods against the package name returned by
270the \fIload()\fR method. In pseudo-code terms looks something like this:
271.PP
272.Vb 1
273\& $class = MyPlugin\->load($context); # returns 'MyPlugin'
274.Ve
275.PP
276.Vb 2
277\& $object = $class\->new($context, @params) # MyPlugin\->new(...)
278\& || die $class\->error(); # MyPlugin\->error()
279.Ve
280.PP
281The \fIload()\fR method may alterately return a blessed reference to an
282object instance. In this case, \fInew()\fR and \fIerror()\fR are then called as
283\&\fIobject\fR methods against that prototype instance.
284.PP
285.Vb 1
286\& package YourPlugin;
287.Ve
288.PP
289.Vb 6
290\& sub load {
291\& my ($class, $context) = @_;
292\& bless {
293\& _CONTEXT => $context,
294\& }, $class;
295\& }
296.Ve
297.PP
298.Vb 4
299\& sub new {
300\& my ($self, $context, @params) = @_;
301\& return $self;
302\& }
303.Ve
304.PP
305In this example, we have implemented a 'Singleton' plugin. One object
306gets created when \fIload()\fR is called and this simply returns itself for
307each call to \fInew()\fR.
308.PP
309Another implementation might require individual objects to be created
310for every call to \fInew()\fR, but with each object sharing a reference to
311some other object to maintain cached data, database handles, etc.
312This pseudo-code example demonstrates the principle.
313.PP
314.Vb 1
315\& package MyServer;
316.Ve
317.PP
318.Vb 7
319\& sub load {
320\& my ($class, $context) = @_;
321\& bless {
322\& _CONTEXT => $context,
323\& _CACHE => { },
324\& }, $class;
325\& }
326.Ve
327.PP
328.Vb 4
329\& sub new {
330\& my ($self, $context, @params) = @_;
331\& MyClient\->new($self, @params);
332\& }
333.Ve
334.PP
335.Vb 1
336\& sub add_to_cache { ... }
337.Ve
338.PP
339.Vb 1
340\& sub get_from_cache { ... }
341.Ve
342.PP
343.Vb 1
344\& package MyClient;
345.Ve
346.PP
347.Vb 7
348\& sub new {
349\& my ($class, $server, $blah) = @_;
350\& bless {
351\& _SERVER => $server,
352\& _BLAH => $blah,
353\& }, $class;
354\& }
355.Ve
356.PP
357.Vb 4
358\& sub get {
359\& my $self = shift;
360\& $self\->{ _SERVER }\->get_from_cache(@_);
361\& }
362.Ve
363.PP
364.Vb 4
365\& sub put {
366\& my $self = shift;
367\& $self\->{ _SERVER }\->add_to_cache(@_);
368\& }
369.Ve
370.PP
371When the plugin is loaded, a \f(CW\*(C`MyServer\*(C'\fR instance is created. The \fInew()\fR
372method is called against this object which instantiates and returns a \f(CW\*(C`MyClient\*(C'\fR
373object, primed to communicate with the creating \f(CW\*(C`MyServer\*(C'\fR.
374.SH "AUTHOR"
375.IX Header "AUTHOR"
376Andy Wardley <abw@wardley.org> <http://wardley.org/>
377.SH "COPYRIGHT"
378.IX Header "COPYRIGHT"
379Copyright (C) 1996\-2007 Andy Wardley. All Rights Reserved.
380.PP
381This module is free software; you can redistribute it and/or
382modify it under the same terms as Perl itself.
383.SH "SEE ALSO"
384.IX Header "SEE ALSO"
385Template, Template::Plugins, Template::Context