79
POE Stefano Rodighiero OpenExp 2006

POE

Embed Size (px)

DESCRIPTION

An introduction to POE, the "Perl Object Environment", a framework for event driven state machines

Citation preview

Page 1: POE

POEStefano Rodighiero

OpenExp 2006

Page 2: POE

POE - A Perl Object Environment

PerlObjectEnvironment

Page 3: POE

POE - A Perl Object Environment

?

Page 4: POE

POE - A Perl Object Environment

Framework

Page 5: POE

POE - A Perl Object Environment

Eventdriven

Page 6: POE

POE - A Perl Object Environment

MultitaskingCooperativo

Page 7: POE

POE - A Perl Object Environment

Singlethread

Page 8: POE

POE - A Perl Object Environment

Networking

Page 9: POE

POE - A Perl Object Environment

Systemadministration

Page 10: POE

POE - A Perl Object Environment

GUI

Page 11: POE

POE - A Perl Object Environment

Page 12: POE

POE - A Perl Object Environment

Component

Wheel

Session

Kernel

“Architettura”

Page 13: POE

POE - A Perl Object Environment

Component

Wheel

Session

Kernel

Dispatch di eventi

Page 14: POE

POE - A Perl Object Environment

Component

Wheel

Session

Kernel

Risponde agli eventi

Page 15: POE

POE - A Perl Object Environment

Component

Wheel

Session

Kernel

“Plugin” per sessioni, incapsula insiemi di

gestori di eventi

POE::Wheel::FollowTailPOE::Wheel::Run

Page 16: POE

POE - A Perl Object Environment

Component

Wheel

Session

Kernel

POE::Component::IRCPOE::Component::Server::TCP

POE::Component::Server::SimpleHTTP…CPAN…

Page 17: POE

POE - A Perl Object Environment

Page 18: POE

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()

Page 19: POE

POE - A Perl Object Environment

sub POE::Kernel::TRACE_EVENTS() { 1 }

Page 20: POE

POE - A Perl Object Environment

use POE;

Page 21: POE

POE - A Perl Object Environment

for ( 1 .. 3 ) { POE::Session -> create( inline_states => { _start => sub { print "Start!\n" }, _stop => sub { print "Stop!\n" } } );}

Page 22: POE

POE - A Perl Object Environment

POE::Kernel->run();

Page 23: POE

POE - A Perl Object Environment

Kernel

Session

_start

Page 24: POE

POE - A Perl Object Environment

Kernel

_start

Session

_start => sub { print "Start!\n" }

Page 25: POE

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

Page 26: POE

POE - A Perl Object Environment

Passaggio di messaggi

post()/yield()

Page 27: POE

POE - A Perl Object Environment

Passaggio di messaggi

call()

Page 28: POE

POE - A Perl Object Environment

Comunicazione tra sessioni

Page 29: POE

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] ); } });

Page 30: POE

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] ); } });

Page 31: POE

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] ); } });

Page 32: POE

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] ); } });

Page 33: POE

POE - A Perl Object Environment

# Sessione bimboPOE::Session->create( inline_states => { _start => sub { $poe_kernel->alias_set( "Paolino" ); $poe_kernel->post( "Santa" => 'lettera' ); } , });

Page 34: POE

POE - A Perl Object Environment

# Sessione bimboPOE::Session->create( inline_states => { _start => sub { $poe_kernel->alias_set( "Paolino" ); $poe_kernel->post( "Santa" => 'lettera' ); } , });

Page 35: POE

POE - A Perl Object Environment

Kernel

Babbo Natale _start

Paolino

_start

Page 36: POE

POE - A Perl Object Environment

Kernel

Babbo Natale

Paolino

post( "Santa", "lettera" )

Page 37: POE

POE - A Perl Object Environment

Kernel

Babbo Natale

Paolino

lettera

Page 38: POE

POE - A Perl Object Environment

Kernel

Babbo Natale

Paolino

post( "Santa", "lettera" )

lettera

lettera

Page 39: POE

POE - A Perl Object Environment

Page 40: POE

POE - A Perl Object Environment

Wheel

Page 41: POE

POE - A Perl Object Environment

Insiemi di gestori di

eventi

Page 42: POE

POE - A Perl Object Environment

POE::Wheel::

FollowTail

Page 43: POE

POE - A Perl Object Environment

use POE qw( Wheel::FollowTail );

Page 44: POE

POE - A Perl Object Environment

$|++

Page 45: POE

POE - A Perl Object Environment

POE::Session->create( inline_states => {...

Page 46: POE

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;} , ...

Page 47: POE

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;} , ...

Page 48: POE

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;} , ...

Page 49: POE

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;} , ...

Page 50: POE

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;} , ...

Page 51: POE

POE - A Perl Object Environment

input_state => sub { my $input = $_[ ARG0 ]; print $input;}

Page 52: POE

POE - A Perl Object Environment

Session

Wheel

__________

__________

__________

__________

__________

__________

Page 53: POE

POE - A Perl Object Environment

Session

Wheel

__________

__________

__________

__________

__________

__________

input_event

Page 54: POE

POE - A Perl Object Environment

Page 55: POE

POE - A Perl Object Environment

POE+ Test+ IRC

Page 56: POE

POE - A Perl Object Environment

Testing?

Page 57: POE

POE - A Perl Object Environment

Test ? IRC

Failed 3/10 tests

Page 58: POE

POE - A Perl Object Environment

09:41 < Quinn> larsen: Avast! Whoreson swab! You failed 3/10 tests!

Page 59: POE

POE - A Perl Object Environment

Test ? IRC

Page 60: POE

POE - A Perl Object Environment

__________

__________

__________

__________

__________

__________

Session

POE::

Wheel::

FollowTail

POE::Component::

IRC

Page 61: POE

POE - A Perl Object Environment

POE::Component::

IRC

Page 62: POE

POE - A Perl Object Environment

use POE qw/ Wheel::FollowTail Component::IRC /;

Page 63: POE

POE - A Perl Object Environment

use Acme::Scurvy::Whoreson::BilgeRat;

Page 64: POE

POE - A Perl Object Environment

my $conf = { nick => 'Quinn', ircname => 'HAR!', server => 'irc.freenode.net', port => 6667};my $channel = '#scummbar';

Page 65: POE

POE - A Perl Object Environment

my $irc = POE::Component::IRC->spawn( %$conf ) or die "HAR!!! $!";

Page 66: POE

POE - A Perl Object Environment

POE::Session->create( package_states => [ 'main' => [ qw( _default _start irc_001 irc_public tell_results ) ], ], heap => { irc => $irc });

Page 67: POE

POE - A Perl Object Environment

POE::Session->create( package_states => [ 'main' => [ qw( _default _start irc_001 irc_public tell_results ) ], ], heap => { irc => $irc });

Page 68: POE

POE - A Perl Object Environment

POE::Session->create( package_states => [ 'main' => [ qw( _default _start irc_001 irc_public tell_results ) ], ], heap => { irc => $irc });

Page 69: POE

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;}

Page 70: POE

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;}

Page 71: POE

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;}

Page 72: POE

POE - A Perl Object Environment

sub irc_001 { my ( $kernel, $sender ) = @_[ KERNEL, SENDER ];

$kernel->post( $sender => join => $channel ); undef;}

Page 73: POE

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!" ); } }}

Page 74: POE

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!" ); } }}

Page 75: POE

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!" ); } }}

Page 76: POE

POE - A Perl Object Environment

Page 77: POE

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 ☺

Page 78: POE

POE - A Perl Object Environment

• http://www.perl.it

• irc.freenode.net,#perl.it

[email protected]

Page 79: POE

Grazie!Stefano Rodighiero

[email protected]