Softpedia
 


LINUX CATEGORIES:



GLOBAL PAGES >>
NEWS ARCHIVE >>
SOFTPEDIA REVIEWS >>
MEET THE EDITORS >>
WEEK'S BEST
  • Linux Kernel 3.9.2 / 3....
  • LibreOffice 3.6.6 / 4.0.3
  • MPlayer 1.1.1
  • systemd 204
  • Arch Linux 2013.05.01
  • Blender 2.67
  • KDE Software Compilatio...
  • CrunchBang Linux Stable...
  • Elementary OS 0.1 / 0.2...
  • SystemRescueCd 3.6.0
  • Home > Linux > Programming > Perl Modules

    POE::Component::Pluggable 1.26

    Download button

    No screenshots available
    Downloads: 268  View global page NEW!  Tell us about an update
    User Rating:
    Rated by:
    NOT RATED
    0 user(s)
    Developer:

    License / Price:

    Last Updated:

    Category:
    Chris Williams | More programs
    Perl Artistic License / FREE
    August 24th, 2009, 19:12 GMT
    ROOT / Programming / Perl Modules

     Read user reviews (0)  Refer to a friend  Subscribe

    POE::Component::Pluggable description

    A base class for creating plugin-enabled POE Components

    POE::Component::Pluggable is a Perl module for creating plugin enabled POE Components. It is a generic port of POE::Component::IRC's plugin system.

    If your component dispatches events to registered POE sessions, then POE::Component::Pluggable may be a good fit for you.

    Basic use would involve subclassing POE::Component::Pluggable, then overriding _pluggable_event() and inserting _pluggable_process() wherever you dispatch events from.

    Users of your component can then load plugins using the plugin methods provided to handle events generated by the component.

    You may also use plugin style handlers within your component as _pluggable_process() will attempt to process any events with local method calls first. The return value of these handlers has the same significance as the return value of 'normal' plugin handlers.

    SYNOPSIS

     # A simple POE Component that sends ping events to registered sessions
     # every 30 seconds. A rather convoluted example to be honest.

     {
     package SimplePoCo;
     
     use strict;
     use base qw(POE::Component::Pluggable);
     use POE;
     use POE::Component::Pluggable::Constants qw(:ALL);
     
     sub spawn {
     my ($package, %opts) = @_;
     $opts{lc $_} = delete $opts{$_} for keys %opts;
     my $self = bless \%opts, $package;
     
     $self->_pluggable_init(prefix => 'simplepoco_');
     POE::Session->create(
     object_states => [
     $self => { shutdown => '_shutdown' },
     $self => [qw(_send_ping _start register unregister __send_event)],
     ],
     heap => $self,
     );
     
     return $self;
     }
     
     sub shutdown {
     my ($self) = @_;
     $poe_kernel->post($self->{session_id}, 'shutdown');
     }
     
     sub _pluggable_event {
     my ($self) = @_;
     $poe_kernel->post($self->{session_id}, '__send_event', @_);
     }
     
     sub _start {
     my ($kernel,$self) = @_[KERNEL,OBJECT];
     $self->{session_id} = $_[SESSION]->ID();
     
     if ($self->{alias}) {
     $kernel->alias_set($self->{alias});
     }
     else {
     $kernel->refcount_increment($self->{session_id}, __PACKAGE__);
     }
     
     $kernel->delay(_send_ping => $self->{time} || 300);
     return;
     }
     
     sub _shutdown {
     my ($kernel, $self) = @_[KERNEL, OBJECT];
     $self->_pluggable_destroy();
     $kernel->alarm_remove_all();
     $self->alias_remove($_) for $kernel->alias_list();
     $kernel->refcount_decrement($self->{session_id}, __PACKAGE__) if !$self->{alias};
     $kernel->refcount_decrement($_, __PACKAGE__) for keys %{ $self->{sessions} };
     
     return;
     }
     
     sub register {
     my ($kernel, $sender, $self) = @_[KERNEL, SENDER, OBJECT];
     my $sender_id = $sender->ID();
     $self->{sessions}->{$sender_id}++;
     
     if ($self->{sessions}->{$sender_id} == 1) {
     $kernel->refcount_increment($sender_id, __PACKAGE__);
     $kernel->yield(__send_event => $self->{_pluggable_prefix} . 'registered', $sender_id);
     }
     
     return;
     }
     
     sub unregister {
     my ($kernel, $sender, $self) = @_[KERNEL, SENDER, OBJECT];
     my $sender_id = $sender->ID();
     my $record = delete $self->{sessions}->{$sender_id};
     
     if ($record) {
     $kernel->refcount_decrement($sender_id, __PACKAGE__);
     $kernel->yield(__send_event => $self->{_pluggable_prefix} . 'unregistered', $sender_id);
     }
     
     return;
     }
     
     sub __send_event {
     my ($kernel, $self, $event, @args) = @_[KERNEL, OBJECT, ARG0..$#_];
     
     return 1 if $self->_pluggable_process(PING => $event, (@args)) == PLUGIN_EAT_ALL;
     
     $kernel->post($_, $event, @args) for keys %{ $self->{sessions} };
     }
     
     sub _send_ping {
     my ($kernel, $self) = @_[KERNEL, OBJECT];
     my $event = $self->{_pluggable_prefix} . 'ping';
     my @args = ('Wake up sleepy');
     $kernel->yield(__send_event => $event, @args);
     $kernel->delay(_send_ping => $self->{time} || 300);
     
     return;
     }
     }
     
     use POE;
     
     my $pluggable = SimplePoCo->spawn(
     alias => 'pluggable',
     time => 30,
     );
     
     POE::Session->create(
     package_states => [
     main => [qw(_start simplepoco_registered simplepoco_ping)],
     ],
     );
     
     $poe_kernel->run();
     
     sub _start {
     my ($kernel, $heap) = @_[KERNEL, HEAP];
     $kernel->post(pluggable => 'register');
     return;
     }
     
     sub simplepoco_registered {
     print "Yay, we registered
    ";
     return;
     }
     
     sub simplepoco_ping {
     my ($sender, $text) = @_[SENDER, ARG0];
     print "Got '$text' from ", $sender->ID, "
    ";
     return;
     }



    Product's homepage

    Requirements:

    · Perl

      


    TAGS:

    POE component | POE plugin | Perl module | Perl | POE | component

    Go to top

    WindowsGamesDriversMacLinuxScriptsMobileHandheldNews

    SUBMIT PROGRAM   |   ADVERTISE   |   GET HELP   |   SEND US FEEDBACK   |   RSS FEEDS   |   UPDATE YOUR SOFTWARE   |   ROMANIAN FORUM