File Coverage

blib/lib/POE/Component/Generic/Object.pm
Criterion Covered Total %
statement 4 6 66.6
branch n/a
condition n/a
subroutine 2 2 100.0
pod n/a
total 6 8 75.0


line stmt bran cond sub pod time code
1             package POE::Component::Generic::Object;
2             # $Id: Object.pm 762 2011-05-18 19:34:32Z fil $
3              
4 1     1   22801 use strict;
  1         2  
  1         34  
5              
6 1     1   1525 use POE;
  0            
  0            
7             use POE::Component::Generic;
8              
9             use Scalar::Util qw( blessed reftype );
10             use Carp qw(carp croak);
11             use vars qw($AUTOLOAD);
12              
13             use strict;
14              
15             our $VERSION = '0.1400';
16              
17             ##################################################
18             # Create the object
19             # $obj_def was sent from Generic::Child->request
20             # $session_id and $package_map come from Generic
21             sub new
22             {
23             my( $package, $obj_def, $session_id, $package_map ) = @_;
24              
25             my $self = bless {
26             OBJid => $obj_def->{OBJid},
27             session_id => $session_id,
28             package => $obj_def->{package}
29             }, $package;
30              
31             $self->__package_map( $package_map, $obj_def->{methods} );
32              
33             return $self;
34             }
35              
36             ##################################################
37             # $package_map comes from Generic->new
38             # $methods came from the child
39             sub __package_map
40             {
41             my( $self, $package_map, $methods ) = @_;
42              
43             unless( $package_map ) {
44             my $c = $package_map = {};
45             foreach my $method ( @$methods ) {
46             my( $package, $m ) =
47             POE::Component::Generic->__method_map( $method );
48             next unless $m;
49             $c->{$m} = $self->{package};
50             }
51             }
52             $self->{package_map} = $package_map;
53             }
54              
55             ##################################################
56             sub AUTOLOAD
57             {
58             my $self = shift;
59             my $method = $AUTOLOAD;
60             $method =~ s/.*:://;
61              
62             croak "$method not an object method" unless blessed $self;
63             unless( $method =~ /[^A-Z]/ ) {
64             croak qq( Can't locate object method "$method" via package ")
65             .ref( $self ). qq("); #"
66             }
67            
68             my $hash = shift;
69             unless( reftype($hash) eq 'HASH' ) {
70             croak "First argument to $method must be a hashref";
71             }
72              
73             unless( $self->{package_map}{ $method } ) {
74             croak qq(Can't locate object method "$method" via package ")
75             .ref( $self ). qq("); #"
76             }
77             $hash->{wantarray} = wantarray() unless (defined($hash->{wantarray}));
78              
79             warn "autoload method $method" if ($self->{debug});
80            
81              
82             $self->__request( $method, $hash, @_ );
83             }
84              
85             ##################################################
86             # Add our arguements to the hash
87             sub __request
88             {
89             my( $self, $method, $hash ) = @_;
90              
91             unless( $self->{package_map}{ $method } or $method eq 'DESTROY' ) {
92             croak "Unknown method $method for package $self->{package}";
93             }
94              
95             $hash->{obj} = $self->object_id;
96             $hash->{package} = $self->{package};
97              
98             # use ->call() so that $generic->method() happens in order
99             return $poe_kernel->call( $self->session_id => '__request2',
100             @_[1 .. $#_] );
101             }
102              
103              
104              
105             ############################################################################
106             # Object methods
107              
108             sub session_id
109             {
110             shift->{session_id};
111             }
112              
113             sub object_id
114             {
115             shift->{OBJid};
116             }
117              
118             sub yield
119             {
120             my $self = shift;
121             if( 'HASH' eq (reftype( $_[2] )||'') ) { croak "Second argument must be a hashref" }
122             return $self->__request( @_ );
123             }
124              
125             sub call
126             {
127             my $self = shift;
128             if( 'HASH' eq (reftype( $_[2] )||'') ) { croak "Second argument must be a hashref" }
129             return $self->__request( @_);
130             }
131              
132             sub DESTROY
133             {
134             if (UNIVERSAL::isa($_[0],__PACKAGE__)) {
135             $_[0]->__request( 'DESTROY', {} );
136             }
137             }
138              
139             1;
140              
141             __END__