POE::Session::Attribute - Use attributes to define your POE Sessions
# in Some/Module.pm package Some::Module ; use base qw(POE::Session::Attribute) ; use POE ; sub _start : Package { # package state my ($pkg, @args) = @_[OBJECT, ARG0 .. $#_] ; ... } sub stop : Object(_stop) { # object state, explicit state name my ($self, ...) = @_[OBJECT, ...] ; ... } sub some_other_event : Inline { # inline state print "boo hoo\n" ; } ... 1 ; # meanwhile, in some other file use Some::Module ; use POE ; my $new_session_id = Some::Module->spawn("your", {arguments => "here"}) ; # or my $new_session_id = Some::Module->create( heap => [], args => ["your", {arguments => "here"}] ) ; ... POE::Kernel->run() ; # Inheritance works, too package Some::Module::Subclass ; use base qw(Some::Module) ; sub _stop : Object { my ($self, @rest) = @_ ; do_some_local_cleanup() ; $self->SUPER::_stop(@rest) ; # you can call parent method, too }
This module's purpose is to save you some boilerplate code around POE::Session->create() method. Just inherit your class from POE::Session::Attribute and define some states using attributes. Method spawn() in your package will be provided by POE::Session::Attribute (of course, you can override it, if any).
spawn()
POE::Session::Attribute tries to be reasonably compatible with POE::Session::AttributeBased. As for now, all material test cases from POE::Session::AttributeBased distribution v0.03 run without errors with POE::Session::Attribute.
Makes a package state. If name is specified, it will be used as a state name. You can specify several names here. Otherwise, the name of your subroutine ("your_sub") will be used as state name.
name
Makes an inline state. If name is specified, it will be used as a state name. You can specify several names here. Otherwise, the name of your subroutine ("your_sub") will be used as state name.
Same as Inline. Added for compatibility with POE::Session::AttributeBased.
Makes an object state. If name is specified, it will be used as a state name. You can specify several names here. Otherwise, the name of your subroutine ("your_sub") will be used as state name.
An instance of your class will be created by create() method, if at least one Object state is defined in your package. Method new() from your package will be called to create the instance. Arguments for the call to new() will be the same as specified for spawn() call (or, in other words, the same as args key to create() method, see below).
create()
new()
args
POE::Session::Attribute provides a default constructor (bless {}, $class). You can (and probably should) override it in your inheriting class. new() will be called by spawn() if at least one Object state is defined.
bless {}, $class
Creates a new POE::Session based on your class/package. Accepts the same arguments as POE::Session->create() method (see POE::Session). You probably should not specify any of inline_states, object_states and package_states, because they will be constructed automatically from your code attributes.
inline_states
object_states
package_states
If you have Object states in your class, create() will call new() method from your class to construct a class instance. args (from create() arguments) will be used as an argument list for this call.
Yes, it's probably somewhat messy. Suggest a fix.
When called in scalar context, returns a reference to a newly created POE::Session (but make sure to read POE::Session documentation to see why you shouldn't use it). In list context, returns a reference to POE::Session and a reference to a newly created instance of your class (in case it was really created).
Same as create(args => [ @argument_list ])
create
POE, POE::Session, attributes, Attribute::Handlers.
There is a somewhat similar module on CPAN, POE::Session::AttributeBased. POE::Session::Attribute is pretty much API-compatible with it.
dmitry kim, <dmitry.kim(at)gmail.com>
Copyright (C) 2006 by dmitry kim
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.7 or, at your option, any later version of Perl 5 you may have available.
To install POE::Session::Attribute, copy and paste the appropriate command in to your terminal.
cpanm
cpanm POE::Session::Attribute
CPAN shell
perl -MCPAN -e shell install POE::Session::Attribute
For more information on module installation, please visit the detailed CPAN module installation guide.