Commit | Line | Data |
58fd1f7f |
1 | =head1 NAME |
2 | |
3 | Web::Simple::AntiquatedPerl - the slides from the talk |
4 | |
5 | =head1 WHAT? |
6 | |
7 | Web::Simple was originally introduced in a talk at the Italian Perl Workshop, |
8 | entitled Antiquated Perl. |
9 | |
10 | The video is available on the Shadowcat site: <http://www.shadowcat.co.uk/archive/conference-video/ipw-2009/antiquated> |
11 | |
12 | If you don't particularly want to watch me confusing a bunch of Italian perl |
13 | mongers, the slides are reproduced below. |
14 | |
15 | =head1 SLIDES |
16 | |
17 | Antiquated |
18 | Perl |
19 | ---- |
20 | Modern |
21 | Perl? |
22 | ---- |
23 | Post |
24 | Modern |
25 | Perl |
26 | ---- |
27 | Enlightened |
28 | Perl |
29 | ---- |
30 | everybody |
31 | knows |
32 | ---- |
33 | Catalyst |
34 | Moose |
35 | DBIx::Class |
36 | ---- |
37 | Modern |
38 | Perl? |
39 | ---- |
40 | perl5 |
41 | v10 |
42 | ---- |
43 | given ($x) { |
44 | when (3) { |
45 | ... |
46 | ---- |
47 | ~~ |
48 | ---- |
49 | what's the |
50 | opposite? |
51 | ---- |
52 | Old |
53 | Perl? |
54 | ---- |
55 | if it |
56 | works |
57 | ---- |
58 | Legacy |
59 | Perl? |
60 | ---- |
61 | not |
62 | interesting |
63 | ---- |
64 | Stupid |
65 | Perl |
66 | ---- |
67 | *$&^*(^ |
68 | FormMail.PL |
69 | ---- |
70 | Antiquated |
71 | Perl |
72 | ---- |
73 | Antique |
74 | ---- |
75 | Old *and* |
76 | beautiful |
77 | ---- |
78 | Simple |
79 | Elegant |
80 | ---- |
81 | $|++ |
82 | ---- |
83 | use IO::Handle; |
84 | STDOUT->autoflush(1); |
85 | ---- |
86 | it's core. |
87 | it's fine. |
88 | ---- |
89 | but why |
90 | think? |
91 | ---- |
92 | select((select(FOO),$|++)[0]) |
93 | ---- |
94 | (select(FOO),$|++) |
95 | -> |
96 | ($old_selected_fh,$|) |
97 | ---- |
98 | (select(FOO),$|++)[0] |
99 | -> |
100 | $old_select_fh |
101 | ---- |
102 | select((select(FOO),$|++)[0]) |
103 | -> |
104 | use IO::Handle; |
105 | FOO->autoflush(1) |
106 | ---- |
107 | ~~ |
108 | ---- |
109 | ~~@x |
110 | ---- |
111 | ~(~(@x)) |
112 | ---- |
113 | bitwise |
114 | negation |
115 | ---- |
116 | so ... |
117 | ---- |
118 | ~@x |
119 | -> |
120 | ~(scalar @x) |
121 | ---- |
122 | ~~$number |
123 | -> |
124 | $number |
125 | ---- |
126 | ~~@x |
127 | -> |
128 | scalar @x |
129 | ---- |
130 | perl -MMoose -e'print ~~keys %INC' |
131 | 84 |
132 | ---- |
133 | overload::constant |
134 | ---- |
135 | lets you |
136 | affect |
137 | parsing |
138 | ---- |
139 | numbers |
140 | strings |
141 | ---- |
142 | q qq qr |
143 | t s qw |
144 | ---- |
145 | i18n.pm |
146 | ---- |
147 | ~~"$foo bar" |
148 | loc("_[0] bar", $foo) |
149 | ---- |
150 | for |
151 | ---- |
152 | for ($foo) { |
153 | /bar/ and ... |
154 | ---- |
155 | for ($foo) { |
156 | /bar/ and return do { |
157 | <code here> |
158 | } |
159 | ---- |
160 | /foo/gc |
161 | ---- |
162 | /\Gbar/gc |
163 | ---- |
164 | sub parse { |
165 | my ($self, $str) = @_; |
166 | for ($str) { |
167 | /match1/gc and return |
168 | $self->_subparse_1($_) |
169 | ---- |
170 | sub _subparse_1 { |
171 | my ($self) = @_; |
172 | for ($_[1]) { |
173 | /\Gsubmatch1/gc ... |
174 | ---- |
175 | prototypes |
176 | ---- |
177 | sub foo (&) { |
178 | ---- |
179 | foo { |
180 | ... |
181 | }; |
182 | ---- |
183 | prototype \&foo |
184 | ---- |
185 | typeglobs |
186 | ---- |
187 | *{"${package}::${name}"} |
188 | = sub { ... } |
189 | ---- |
190 | local |
191 | ---- |
192 | local $_ |
193 | ---- |
194 | local *Carp::croak |
195 | = \&Carp::confess; |
196 | ---- |
197 | do { |
198 | local (@ARGV, $/) = $file; |
199 | <> |
200 | } |
201 | ---- |
202 | strict |
203 | and |
204 | warnings |
205 | ---- |
206 | strict->import |
207 | ---- |
208 | affects |
209 | compilation |
210 | scope |
211 | ---- |
212 | sub strict_and_warnings::import { |
213 | strict->import; |
214 | warnings->import; |
215 | } |
216 | ---- |
217 | use strict_and_warnings; |
218 | ---- |
219 | $^H |
220 | %^H |
221 | ---- |
222 | $^H |= 0x120000; |
223 | $^H{'foo'} |
224 | = bless($foo, 'My::Foo'); |
225 | ---- |
226 | sub My::Foo::DESTROY { |
227 | ---- |
228 | delete ${$package}{myimport} |
229 | ---- |
230 | B::Hooks::EndOfScope |
231 | ---- |
232 | tie |
233 | ---- |
234 | tie $var, 'Foo'; |
235 | ---- |
236 | sub FETCH |
237 | sub STORE |
238 | ---- |
239 | Scalar |
240 | Array |
241 | Hash |
242 | Handle |
243 | ---- |
244 | now ... |
245 | ---- |
246 | mst: destruction |
247 | testing technology |
248 | since March 1983 |
249 | ---- |
250 | 3 days |
251 | old |
252 | ---- |
253 | 2 weeks |
254 | early |
255 | ---- |
256 | incubator |
257 | ---- |
258 | glass box |
259 | plastic tray |
260 | heater |
261 | ---- |
262 | design |
263 | flaw |
264 | ---- |
265 | BANG |
266 | ---- |
267 | so ... |
268 | ---- |
269 | interesting |
270 | fact |
271 | ---- |
272 | prototypes |
273 | only warn |
274 | when parsed |
275 | ---- |
276 | error when |
277 | compiled |
278 | ---- |
279 | so ... |
280 | ---- |
281 | dispatch [ |
282 | sub (GET + /) { ... }, |
283 | sub (GET + /user/*) { ... } |
284 | ]; |
285 | ---- |
286 | foreach my $sub (@$dispatch) { |
287 | my $proto = prototype $sub; |
288 | $parser->parse($proto); |
289 | ... |
290 | ---- |
291 | PARSE: { do { |
292 | push @match, $self->_parse_spec_section($spec) |
293 | or $self->_blam("Unable to work out what the next section is"); |
294 | last PARSE if (pos == length); |
295 | /\G\+/gc or $self->_blam('Spec sections must be separated by +'); |
296 | } until (pos == length) }; |
297 | ---- |
298 | sub _blam { |
299 | my ($self, $error) = @_; |
300 | my $hat = (' ' x pos).'^'; |
301 | die "Error parsing dispatch specification: ${error}\n |
302 | ${_} |
303 | ${hat} here\n"; |
304 | } |
305 | ---- |
306 | Error parsing ... |
307 | GET+/foo |
308 | ^ here |
309 | ---- |
310 | sub (GET + /user/*) { |
311 | my ($self, $user) = @_; |
312 | ---- |
313 | I hate |
314 | fetching |
315 | $self |
316 | ---- |
317 | *{"${app}::self"} |
318 | = \${"${app}::self"}; |
319 | ---- |
320 | use vars |
321 | ---- |
322 | sub _run_with_self { |
323 | my ($self, $run, @args) = @_; |
324 | my $class = ref($self); |
325 | no strict 'refs'; |
326 | local *{"${class}::self"} = \$self; |
327 | $self->$run(@args); |
328 | } |
329 | ---- |
330 | HTML |
331 | output |
332 | ---- |
333 | templates |
334 | ---- |
335 | HTML is |
336 | NOT TEXT |
337 | ---- |
338 | <div>, |
339 | $text, |
340 | </div>; |
341 | ---- |
342 | <div> |
343 | ---- |
344 | <$fh> |
345 | ---- |
346 | tie *{"${app}::${name}"}, |
347 | 'XML::Tags::TIEHANDLE', |
348 | "<${name}>"; |
349 | ---- |
350 | sub TIEHANDLE { my $str = $_[1]; bless \$str, $_[0] } |
351 | sub READLINE { ${$_[0]} } |
352 | ---- |
353 | sub DESTROY { |
354 | my ($into, @names) = @$_[0]; |
355 | no strict 'refs'; |
356 | delete ${$into}{$_} |
357 | for @names; |
358 | } |
359 | ---- |
360 | </div> |
361 | ---- |
362 | glob('/div'); |
363 | ---- |
364 | *CORE::GLOBAL::glob |
365 | = sub { ... }; |
366 | ---- |
367 | delete |
368 | ${CORE::GLOBAL::}{glob}; |
369 | ---- |
370 | sub foo { |
371 | use XML::Tags qw(div); |
372 | <div>, "foo!", </div>; |
373 | } |
374 | ---- |
375 | what about |
376 | interpolation |
377 | ---- |
378 | my $stuff = 'foo"bar'; |
379 | <a href="$stuff"> |
380 | ---- |
381 | hmm ... |
382 | ---- |
383 | overload::constant! |
384 | ---- |
385 | glob('a href="'.$stuff.'"'); |
386 | ---- |
387 | glob( |
388 | bless(\'a href="', 'MagicTag') |
389 | .$stuff |
390 | .bless(\'"', 'MagicTag') |
391 | ) |
392 | ---- |
393 | use overload |
394 | '.' => 'concat'; |
395 | |
396 | sub concat { |
397 | ---- |
398 | hooking |
399 | it up |
400 | ---- |
401 | sub (.html) { |
402 | filter_response { |
403 | $self->render_html($_[1]) |
404 | } |
405 | } |
406 | ---- |
407 | bless( |
408 | $_[1], |
409 | 'Web::Simple::ResponseFilter' |
410 | ); |
411 | ---- |
412 | if ($self->_is_response_filter($result)) { |
413 | return $self->_run_with_self( |
414 | $result, |
415 | $self->_run_dispatch_for($new_env, \@disp) |
416 | ); |
417 | } |
418 | ---- |
419 | and the result? |
420 | ---- |
421 | goto &demo; |
422 | ---- |
423 | questions? |
424 | ---- |
425 | thank |
426 | you |
427 | |
428 | =head1 AUTHOR |
429 | |
430 | Matt S. Trout <mst@shadowcat.co.uk> |
431 | |
432 | =head1 COPYRIGHT |
433 | |
f42be65c |
434 | Copyright (c) 2011 Matt S. Trout <mst@shadowcat.co.uk> |
58fd1f7f |
435 | |
436 | =head1 LICENSE |
437 | |
f2ff31cd |
438 | This text is free documentation under the same license as perl itself. |
58fd1f7f |
439 | |
440 | =cut |