NAME

Web::Simple::AntiquatedPerl - the slides from the talk

WHAT?

Web::Simple was originally introduced in a talk at the Italian Perl Workshop, entitled Antiquated Perl.

The video is available on the Shadowcat site: <http://www.shadowcat.co.uk/archive/conference-video/ipw-2009/antiquated>

If you don't particularly want to watch me confusing a bunch of Italian perl mongers, the slides are reproduced below.

SLIDES

Antiquated
Perl
----
Modern
Perl?
----
Post
Modern
Perl
----
Enlightened
Perl
----
everybody
knows
----
Catalyst
Moose
DBIx::Class
----
Modern
Perl?
----
perl5
v10
----
  given ($x) {
    when (3) {
  ...
----
~~
----
what's the
opposite?
----
Old
Perl?
----
if it 
works
----
Legacy
Perl?
----
not
interesting
----
Stupid
Perl
----
*$&^*(^
FormMail.PL
----
Antiquated
Perl
----
Antique
----
Old *and*
beautiful
----
Simple
Elegant
----
  $|++
----
  use IO::Handle;
  STDOUT->autoflush(1);
----
it's core.
it's fine.
----
but why
think?
----
  select((select(FOO),$|++)[0])
----
  (select(FOO),$|++)
  ->
  ($old_selected_fh,$|)
----
  (select(FOO),$|++)[0]
  ->
  $old_select_fh
----
  select((select(FOO),$|++)[0])
  ->
  use IO::Handle;
  FOO->autoflush(1)
----
~~
----
  ~~@x
----
  ~(~(@x))
----
bitwise
negation
----
so ...
----
  ~@x
  ->
  ~(scalar @x)
----
  ~~$number
  ->
  $number
----
  ~~@x
  ->
  scalar @x
----
  perl -MMoose -e'print ~~keys %INC'
  84
----
overload::constant
----
lets you
affect
parsing
----
numbers
strings
----
q qq qr
t s qw
----
i18n.pm
----
~~"$foo bar"
loc("_[0] bar", $foo)
----
for
----
  for ($foo) {
    /bar/ and ...
----
  for ($foo) {
    /bar/ and return do {
      <code here>
    }
----
  /foo/gc
----
  /\Gbar/gc
----
  sub parse {
    my ($self, $str) = @_;
    for ($str) {
      /match1/gc and return
        $self->_subparse_1($_)
----
  sub _subparse_1 {
    my ($self) = @_;
    for ($_[1]) {
      /\Gsubmatch1/gc ...
----
prototypes
----
  sub foo (&) {
----
  foo {
    ...
  };
----
  prototype \&foo
----
typeglobs
----
  *{"${package}::${name}"}
    = sub { ... }
---- 
  local
----
  local $_
----
  local *Carp::croak
    = \&Carp::confess;
----
  do {
    local (@ARGV, $/) = $file;
    <>
  }
----
strict
and
warnings
----
  strict->import
----
affects
compilation
scope
----
  sub strict_and_warnings::import {
    strict->import;
    warnings->import;
  }
----
  use strict_and_warnings;
----
$^H
%^H
----
  $^H |= 0x20000;
  $^H{'foo'}
    = bless($foo, 'My::Foo');
----
  sub My::Foo::DESTROY {
----
  delete ${$package}{myimport}
----
B::Hooks::EndOfScope
----
tie
----
  tie $var, 'Foo';
----
  sub FETCH
  sub STORE
----
Scalar
Array
Hash
Handle
----
now ...
----
mst: destruction
testing technology
since March 1983
----
3 days
old
----
2 weeks
early
----
incubator
----
glass box
plastic tray
heater
----
design
flaw
----
BANG
----
so ...
----
interesting
fact
----
prototypes
only warn
when parsed
----
error when
compiled
----
so ...
----
  dispatch [
    sub (GET + /) { ... },
    sub (GET + /user/*) { ... }
  ];
----
  foreach my $sub (@$dispatch) {
    my $proto = prototype $sub;
    $parser->parse($proto);
    ...
----
  PARSE: { do {
    push @match, $self->_parse_spec_section($spec)
      or $self->_blam("Unable to work out what the next section is");
    last PARSE if (pos == length);
    /\G\+/gc or $self->_blam('Spec sections must be separated by +');
  } until (pos == length) };
----
  sub _blam {
    my ($self, $error) = @_;
    my $hat = (' ' x pos).'^';
    die "Error parsing dispatch specification: ${error}\n
  ${_}
  ${hat} here\n";
  }
----
  Error parsing ...
  GET+/foo
     ^ here
----
  sub (GET + /user/*) {
   my ($self, $user) = @_;
----
I hate
fetching
$self
----
  *{"${app}::self"}
    = \${"${app}::self"};
----
use vars
----
  sub _run_with_self {
    my ($self, $run, @args) = @_;
    my $class = ref($self);
    no strict 'refs';
    local *{"${class}::self"} = \$self;
    $self->$run(@args);
  }
----
HTML
output
----
templates
----
HTML is
NOT TEXT
----
  <div>,
    $text,
  </div>;
----
<div>
----
<$fh>
----
  tie *{"${app}::${name}"},
    'XML::Tags::TIEHANDLE',
    "<${name}>";
----
  sub TIEHANDLE { my $str = $_[1]; bless \$str, $_[0] }
  sub READLINE { ${$_[0]} }
----
  sub DESTROY {
    my ($into, @names) = @$_[0];
    no strict 'refs';
    delete ${$into}{$_}
      for @names;
  }
----
</div>
----
glob('/div');
----
  *CORE::GLOBAL::glob
    = sub { ... };
----
  delete
    ${CORE::GLOBAL::}{glob};
----
  sub foo {
    use XML::Tags qw(div);
    <div>, "foo!", </div>;
  }
----
what about
interpolation
----
  my $stuff = 'foo"bar';
  <a href="$stuff">
----
hmm ...
----
overload::constant!
----
  glob('a href="'.$stuff.'"');
----
  glob(
    bless(\'a href="', 'MagicTag')
    .$stuff
    .bless(\'"', 'MagicTag')
  )
----
  use overload
    '.' => 'concat';

  sub concat {
----
hooking
it up
----
  sub (.html) {
    filter_response {
      $self->render_html($_[1])
    }
  }
----
  bless(
    $_[1],
    'Web::Simple::ResponseFilter'
  );
----
  if ($self->_is_response_filter($result)) {
    return $self->_run_with_self(
      $result,
      $self->_run_dispatch_for($new_env, \@disp)
    );
  }
----
and the result?
----
 goto &demo;
----
questions?
----
thank
you

AUTHOR

Matt S. Trout <mst@shadowcat.co.uk>

COPYRIGHT

Copyright (c) 2011 Matt S. Trout <mst@shadowcat.co.uk>

LICENSE

This text is free documentation under the same license as perl itself.