Upload
stefano-rodighiero
View
4.325
Download
2
Tags:
Embed Size (px)
DESCRIPTION
An introduction to POE, the "Perl Object Environment", a framework for event driven state machines
Citation preview
POEStefano Rodighiero
OpenExp 2006
POE - A Perl Object Environment
PerlObjectEnvironment
POE - A Perl Object Environment
?
POE - A Perl Object Environment
Framework
POE - A Perl Object Environment
Eventdriven
POE - A Perl Object Environment
MultitaskingCooperativo
POE - A Perl Object Environment
Singlethread
POE - A Perl Object Environment
Networking
POE - A Perl Object Environment
Systemadministration
POE - A Perl Object Environment
GUI
POE - A Perl Object Environment
POE - A Perl Object Environment
Component
Wheel
Session
Kernel
“Architettura”
POE - A Perl Object Environment
Component
Wheel
Session
Kernel
Dispatch di eventi
POE - A Perl Object Environment
Component
Wheel
Session
Kernel
Risponde agli eventi
POE - A Perl Object Environment
Component
Wheel
Session
Kernel
“Plugin” per sessioni, incapsula insiemi di
gestori di eventi
POE::Wheel::FollowTailPOE::Wheel::Run
POE - A Perl Object Environment
Component
Wheel
Session
Kernel
POE::Component::IRCPOE::Component::Server::TCP
POE::Component::Server::SimpleHTTP…CPAN…
POE - A Perl Object Environment
POE - A Perl Object Environment
Un programma tipico
• Istanzia una o più sessioni
• Esplicitamente, eventualmente usando delle Wheel
• Implicitamente, con Componenti già pronti
• POE::Kernel->run()
POE - A Perl Object Environment
sub POE::Kernel::TRACE_EVENTS() { 1 }
POE - A Perl Object Environment
use POE;
POE - A Perl Object Environment
for ( 1 .. 3 ) { POE::Session -> create( inline_states => { _start => sub { print "Start!\n" }, _stop => sub { print "Stop!\n" } } );}
POE - A Perl Object Environment
POE::Kernel->run();
POE - A Perl Object Environment
Kernel
Session
_start
POE - A Perl Object Environment
Kernel
_start
Session
_start => sub { print "Start!\n" }
POE - A Perl Object Environment
Passaggio di messaggi
post() Accoda un evento, da inoltrare alla session specificata
yield() Accoda un evento, da inoltrare alla session stessa
call()Invoca - in maniera
sincrona - un evento per una sessione specificata
POE - A Perl Object Environment
Passaggio di messaggi
post()/yield()
POE - A Perl Object Environment
Passaggio di messaggi
call()
POE - A Perl Object Environment
Comunicazione tra sessioni
POE - A Perl Object Environment
# Sessione Babbo NatalePOE::Session->create( inline_states => { _start => sub { print "Oh oh oh!\n"; $poe_kernel->alias_set( "Santa" ); } , lettera => sub { print "Lettera da " . $poe_kernel->alias_list( $_[SENDER] ); } });
POE - A Perl Object Environment
# Sessione Babbo NatalePOE::Session->create( inline_states => { _start => sub { print "Oh oh oh!\n"; $poe_kernel->alias_set( "Santa" ); } , lettera => sub { print "Lettera da " . $poe_kernel->alias_list( $_[SENDER] ); } });
POE - A Perl Object Environment
# Sessione Babbo NatalePOE::Session->create( inline_states => { _start => sub { print "Oh oh oh!\n"; $poe_kernel->alias_set( "Santa" ); } , lettera => sub { print "Lettera da " . $poe_kernel->alias_list( $_[SENDER] ); } });
POE - A Perl Object Environment
# Sessione Babbo NatalePOE::Session->create( inline_states => { _start => sub { print "Oh oh oh!\n"; $poe_kernel->alias_set( "Santa" ); } , lettera => sub { print "Lettera da " . $poe_kernel->alias_list( $_[SENDER] ); } });
POE - A Perl Object Environment
# Sessione bimboPOE::Session->create( inline_states => { _start => sub { $poe_kernel->alias_set( "Paolino" ); $poe_kernel->post( "Santa" => 'lettera' ); } , });
POE - A Perl Object Environment
# Sessione bimboPOE::Session->create( inline_states => { _start => sub { $poe_kernel->alias_set( "Paolino" ); $poe_kernel->post( "Santa" => 'lettera' ); } , });
POE - A Perl Object Environment
Kernel
Babbo Natale _start
Paolino
_start
POE - A Perl Object Environment
Kernel
Babbo Natale
Paolino
post( "Santa", "lettera" )
POE - A Perl Object Environment
Kernel
Babbo Natale
Paolino
lettera
POE - A Perl Object Environment
Kernel
Babbo Natale
Paolino
post( "Santa", "lettera" )
lettera
lettera
POE - A Perl Object Environment
POE - A Perl Object Environment
Wheel
POE - A Perl Object Environment
Insiemi di gestori di
eventi
POE - A Perl Object Environment
POE::Wheel::
FollowTail
POE - A Perl Object Environment
use POE qw( Wheel::FollowTail );
POE - A Perl Object Environment
$|++
POE - A Perl Object Environment
POE::Session->create( inline_states => {...
POE - A Perl Object Environment
_start => sub { my $heap = $_[ HEAP ]; my $watcher = POE::Wheel::FollowTail->new( Filename => 'logfile.log', PollInterval => 1, InputEvent => 'input_state' ); $heap->{ watcher } = $watcher;} , ...
POE - A Perl Object Environment
_start => sub { my $heap = $_[ HEAP ]; my $watcher = POE::Wheel::FollowTail->new( Filename => 'logfile.log', PollInterval => 1, InputEvent => 'input_state' ); $heap->{ watcher } = $watcher;} , ...
POE - A Perl Object Environment
_start => sub { my $heap = $_[ HEAP ]; my $watcher = POE::Wheel::FollowTail->new( Filename => 'logfile.log', PollInterval => 1, InputEvent => 'input_state' ); $heap->{ watcher } = $watcher;} , ...
POE - A Perl Object Environment
_start => sub { my $heap = $_[ HEAP ]; my $watcher = POE::Wheel::FollowTail->new( Filename => 'logfile.log', PollInterval => 1, InputEvent => 'input_state' ); $heap->{ watcher } = $watcher;} , ...
POE - A Perl Object Environment
_start => sub { my $heap = $_[ HEAP ]; my $watcher = POE::Wheel::FollowTail->new( Filename => 'logfile.log', PollInterval => 1, InputEvent => 'input_state' ); $heap->{ watcher } = $watcher;} , ...
POE - A Perl Object Environment
input_state => sub { my $input = $_[ ARG0 ]; print $input;}
POE - A Perl Object Environment
Session
Wheel
__________
__________
__________
__________
__________
__________
POE - A Perl Object Environment
Session
Wheel
__________
__________
__________
__________
__________
__________
input_event
POE - A Perl Object Environment
POE - A Perl Object Environment
POE+ Test+ IRC
POE - A Perl Object Environment
Testing?
POE - A Perl Object Environment
Test ? IRC
Failed 3/10 tests
POE - A Perl Object Environment
09:41 < Quinn> larsen: Avast! Whoreson swab! You failed 3/10 tests!
POE - A Perl Object Environment
Test ? IRC
POE - A Perl Object Environment
__________
__________
__________
__________
__________
__________
Session
POE::
Wheel::
FollowTail
POE::Component::
IRC
POE - A Perl Object Environment
POE::Component::
IRC
POE - A Perl Object Environment
use POE qw/ Wheel::FollowTail Component::IRC /;
POE - A Perl Object Environment
use Acme::Scurvy::Whoreson::BilgeRat;
POE - A Perl Object Environment
my $conf = { nick => 'Quinn', ircname => 'HAR!', server => 'irc.freenode.net', port => 6667};my $channel = '#scummbar';
POE - A Perl Object Environment
my $irc = POE::Component::IRC->spawn( %$conf ) or die "HAR!!! $!";
POE - A Perl Object Environment
POE::Session->create( package_states => [ 'main' => [ qw( _default _start irc_001 irc_public tell_results ) ], ], heap => { irc => $irc });
POE - A Perl Object Environment
POE::Session->create( package_states => [ 'main' => [ qw( _default _start irc_001 irc_public tell_results ) ], ], heap => { irc => $irc });
POE - A Perl Object Environment
POE::Session->create( package_states => [ 'main' => [ qw( _default _start irc_001 irc_public tell_results ) ], ], heap => { irc => $irc });
POE - A Perl Object Environment
sub _start { my ( $kernel, $heap ) = @_[ KERNEL, HEAP ];
my $watcher = POE::Wheel::FollowTail->new( Filename => 'tests.log' , PollInterval => 1 , InputEvent => 'tell_results' );
$heap->{ watcher } = $watcher;
my $irc_sess = $heap->{irc}->session_id(); $kernel->post( $irc_sess => register => 'all' ); $kernel->post( $irc_sess => connect => {} ); undef;}
POE - A Perl Object Environment
sub _start { my ( $kernel, $heap ) = @_[ KERNEL, HEAP ];
my $watcher = POE::Wheel::FollowTail->new( Filename => 'tests.log' , PollInterval => 1 , InputEvent => 'tell_results' );
$heap->{ watcher } = $watcher;
my $irc_sess = $heap->{irc}->session_id(); $kernel->post( $irc_sess => register => 'all' ); $kernel->post( $irc_sess => connect => {} ); undef;}
POE - A Perl Object Environment
sub _start { my ( $kernel, $heap ) = @_[ KERNEL, HEAP ];
my $watcher = POE::Wheel::FollowTail->new( Filename => 'tests.log' , PollInterval => 1 , InputEvent => 'tell_results' );
$heap->{ watcher } = $watcher;
my $irc_sess = $heap->{irc}->session_id(); $kernel->post( $irc_sess => register => 'all' ); $kernel->post( $irc_sess => connect => {} ); undef;}
POE - A Perl Object Environment
sub irc_001 { my ( $kernel, $sender ) = @_[ KERNEL, SENDER ];
$kernel->post( $sender => join => $channel ); undef;}
POE - A Perl Object Environment
sub tell_results { my $kernel = $_[KERNEL]; my $heap = $_[HEAP]; my $line = $_[ARG0]; my $irc_session = $heap->{irc};
my ($failed, $total) = split qr|/|, $line;
if ($failed) { my $insult = Acme::Scurvy::Whoreson::BilgeRat->new( language => 'pirate' );
$kernel->post( $irc_session => privmsg => $channel => "$insult! You failed $failed tests!" ); } }}
POE - A Perl Object Environment
sub tell_results { my $kernel = $_[KERNEL]; my $heap = $_[HEAP]; my $line = $_[ARG0]; my $irc_session = $heap->{irc};
my ($failed, $total) = split qr|/|, $line;
if ($failed) { my $insult = Acme::Scurvy::Whoreson::BilgeRat->new( language => 'pirate' );
$kernel->post( $irc_session => privmsg => $channel => "$insult! You failed $failed tests!" ); } }}
POE - A Perl Object Environment
sub tell_results { my $kernel = $_[KERNEL]; my $heap = $_[HEAP]; my $line = $_[ARG0]; my $irc_session = $heap->{irc};
my ($failed, $total) = split qr|/|, $line;
if ($failed) { my $insult = Acme::Scurvy::Whoreson::BilgeRat->new( language => 'pirate' );
$kernel->post( $irc_session => privmsg => $channel => "$insult! You failed $failed tests!" ); } }}
POE - A Perl Object Environment
POE - A Perl Object Environment
• irc.freenode.net,#poe
• http://poe.perl.org
• “Advanced Perl Programming” (O’Reilly) - Cap.7
• http://del.icio.us/slr/poe ☺
POE - A Perl Object Environment
• http://www.perl.it
• irc.freenode.net,#perl.it
Grazie!Stefano Rodighiero