Thread::Queue::Queueable - abstract class for marshalling elements for a Thread::Queue::Duplex queue



NAME

Thread::Queue::Queueable - abstract class for marshalling elements for a Thread::Queue::Duplex queue


SYNOPSIS

        use Thread::Queue::Queueable;
        use base qw(Thread::Queue::Queueable);
        #
        #       implement onEnqueue method
        #       (default implementation shown)
        #
        sub onEnqueue {
                my $obj = shift;
        #
        #       capture class name, and create shared
        #       version of object
        #
                return $obj->isa('ARRAY') ?
                        (ref $obj, share([ @$obj ])) :
                        (ref $obj, share({ %$obj }));
        }
        #
        #       implement onDequeue method
        #       (default implementation shown)
        #
        sub onDequeue {
                my ($class, $obj) = @_;
        #
        #       reconstruct as non-shared
        #
                $obj = (ref $obj eq 'ARRAY') ? [ @$obj ] : { %$obj };
                bless $obj, $class;
                return $obj;
        }
        #
        #       permit the object to be reconstructed on dequeueing
        #
        sub onCancel {
                my $obj = shift;
                return 1;
        }
        #
        #       curse (ie, unbless) the object into a shared structure
        #
        sub curse {
                my $obj = shift;
                if ($obj->isa('HASH')) {
                        my %cursed : shared = ();
                        $cursed{$_} = $obj->{$_}
                                foreach (keys %$obj);
                        return \%cursed;
                }
                my @cursed : shared = ();
                $cursed[$_] = $obj->[$_]
                        foreach (0..$#$obj);
                return \@cursed;
        }
        #
        #       redeem (ie, rebless) the object into
        #       the class
        #
        sub redeem {
                my ($class, $obj) = @_;
                if (ref $obj eq 'HASH') {
                        my $redeemed = {};
                        $redeemed->{$_} = $obj->{$_}
                                foreach (keys %$obj);
                        return bless $redeemed, $class;
                }
                my $redeemed = [];
                $redeemed->[$_] = $obj->[$_]
                        foreach (0..$#$obj);
                return bless $redeemed, $class;
        }


DESCRIPTION

Thread::Queue::Queueable (aka TQQ) provides abstract methods to be invoked whenever an object is enqueued or dequeued, in either the request or response direction, on a the Thread::Queue::Duplex manpage (TQD) queue.

The primary purpose is to simplify application logic so that marshalling/unmarhsalling of objects between threads is performed automatically. In addition, when subclassed, the application class can modify or add logic (e.g., notifying a server thread object to update its reference count when a wrapped object is passed between threads - see the DBIx::Threaded manpage for an example).


METHODS

Refer to the included classdocs for summary and detailed method descriptions.


SEE ALSO

the Thread::Queue::Duplex manpage, the threads manpage, the threads::shared manpage, the Thread::Queue manpage


AUTHOR, COPYRIGHT, & LICENSE

Dean Arnold, Presicient Corp. darnold@presicient.com

Copyright(C) 2005, Presicient Corp., USA

Permission is granted to use this software under the same terms as Perl itself. Refer to the Perl Artistic License for details.

 Thread::Queue::Queueable - abstract class for marshalling elements for a Thread::Queue::Duplex queue