| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package Net::AMQP::Protocol::Base; | 
| 2 |  |  |  |  |  |  |  | 
| 3 |  |  |  |  |  |  | =head1 NAME | 
| 4 |  |  |  |  |  |  |  | 
| 5 |  |  |  |  |  |  | Net::AMQP::Protocol::Base - Base class of auto-generated protocol classes | 
| 6 |  |  |  |  |  |  |  | 
| 7 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 8 |  |  |  |  |  |  |  | 
| 9 |  |  |  |  |  |  | See L for how subclasses to this class are auto-generated. | 
| 10 |  |  |  |  |  |  |  | 
| 11 |  |  |  |  |  |  | =cut | 
| 12 |  |  |  |  |  |  |  | 
| 13 | 5 |  |  | 5 |  | 24 | use strict; | 
|  | 5 |  |  |  |  | 10 |  | 
|  | 5 |  |  |  |  | 179 |  | 
| 14 | 5 |  |  | 5 |  | 23 | use warnings; | 
|  | 5 |  |  |  |  | 9 |  | 
|  | 5 |  |  |  |  | 211 |  | 
| 15 | 5 |  |  | 5 |  | 23 | use base qw(Class::Data::Inheritable Class::Accessor::Fast); | 
|  | 5 |  |  |  |  | 8 |  | 
|  | 5 |  |  |  |  | 4966 |  | 
| 16 |  |  |  |  |  |  |  | 
| 17 |  |  |  |  |  |  | BEGIN { | 
| 18 | 5 |  |  | 5 |  | 29937 | __PACKAGE__->mk_classdata($_) foreach qw( | 
| 19 |  |  |  |  |  |  | class_id | 
| 20 |  |  |  |  |  |  | method_id | 
| 21 |  |  |  |  |  |  | frame_arguments | 
| 22 |  |  |  |  |  |  | class_spec | 
| 23 |  |  |  |  |  |  | method_spec | 
| 24 |  |  |  |  |  |  | ); | 
| 25 |  |  |  |  |  |  | } | 
| 26 |  |  |  |  |  |  |  | 
| 27 |  |  |  |  |  |  | =head1 CLASS METHODS | 
| 28 |  |  |  |  |  |  |  | 
| 29 |  |  |  |  |  |  | =head2 class_id | 
| 30 |  |  |  |  |  |  |  | 
| 31 |  |  |  |  |  |  | The class id from the specficiation. | 
| 32 |  |  |  |  |  |  |  | 
| 33 |  |  |  |  |  |  | =head2 method_id | 
| 34 |  |  |  |  |  |  |  | 
| 35 |  |  |  |  |  |  | The method id from the specification.  In the case of a content  (such as Basic, File or Stream), method_id is 0 for the virtual ContentHeader method.  This allows you to create a Header frame in much the same way you create a Method frame, but with the virtual method 'ContentHeader'.  For example: | 
| 36 |  |  |  |  |  |  |  | 
| 37 |  |  |  |  |  |  | my $header_frame = Net::AMQP::Protocol::Basic::ContentHeader->new( | 
| 38 |  |  |  |  |  |  | content_type => 'text/html' | 
| 39 |  |  |  |  |  |  | ); | 
| 40 |  |  |  |  |  |  |  | 
| 41 |  |  |  |  |  |  | print $header_frame->method_id(); # prints '0' | 
| 42 |  |  |  |  |  |  |  | 
| 43 |  |  |  |  |  |  | =head2 frame_arguments | 
| 44 |  |  |  |  |  |  |  | 
| 45 |  |  |  |  |  |  | Contains an ordered arrayref of the fields that comprise a frame for this method.  For example: | 
| 46 |  |  |  |  |  |  |  | 
| 47 |  |  |  |  |  |  | Net::AMQP::Protocol::Channel::Open->frame_arguments([ | 
| 48 |  |  |  |  |  |  | out_of_band => 'short_string' | 
| 49 |  |  |  |  |  |  | ]); | 
| 50 |  |  |  |  |  |  |  | 
| 51 |  |  |  |  |  |  | This is used by the L subclasses to (de)serialize raw binary data.  Each of these fields are also an accessor for the class objects. | 
| 52 |  |  |  |  |  |  |  | 
| 53 |  |  |  |  |  |  | =head2 class_spec | 
| 54 |  |  |  |  |  |  |  | 
| 55 |  |  |  |  |  |  | Contains the hashref that the C call generated for this class. | 
| 56 |  |  |  |  |  |  |  | 
| 57 |  |  |  |  |  |  | =head2 method_spec | 
| 58 |  |  |  |  |  |  |  | 
| 59 |  |  |  |  |  |  | Same as above, but for this method. | 
| 60 |  |  |  |  |  |  |  | 
| 61 |  |  |  |  |  |  | =back | 
| 62 |  |  |  |  |  |  |  | 
| 63 |  |  |  |  |  |  | =cut | 
| 64 |  |  |  |  |  |  |  | 
| 65 |  |  |  |  |  |  | sub new { | 
| 66 | 0 |  |  | 0 | 1 |  | my ($class, %self) = @_; | 
| 67 |  |  |  |  |  |  |  | 
| 68 | 0 |  |  |  |  |  | return bless \%self, $class; | 
| 69 |  |  |  |  |  |  | } | 
| 70 |  |  |  |  |  |  |  | 
| 71 |  |  |  |  |  |  | sub register { | 
| 72 | 0 |  |  | 0 | 0 |  | my $class = shift; | 
| 73 |  |  |  |  |  |  |  | 
| 74 |  |  |  |  |  |  | # Inform the Frame::Method class of the existance of this method type | 
| 75 | 0 | 0 | 0 |  |  |  | if ($class->class_id && $class->method_id) { | 
|  |  | 0 | 0 |  |  |  |  | 
| 76 | 0 |  |  |  |  |  | Net::AMQP::Frame::Method->register_method_class($class); | 
| 77 |  |  |  |  |  |  | } | 
| 78 |  |  |  |  |  |  | elsif ($class->class_id && ! $class->method_id) { | 
| 79 | 0 |  |  |  |  |  | Net::AMQP::Frame::Header->register_header_class($class); | 
| 80 |  |  |  |  |  |  | } | 
| 81 |  |  |  |  |  |  |  | 
| 82 |  |  |  |  |  |  | # Create accessor methods in the subclass for frame data | 
| 83 | 0 |  |  |  |  |  | my @accessors; | 
| 84 | 0 |  |  |  |  |  | my $arguments = $class->frame_arguments; | 
| 85 | 0 |  |  |  |  |  | for (my $i = 0; $i <= $#{ $arguments }; $i += 2) { | 
|  | 0 |  |  |  |  |  |  | 
| 86 | 0 |  |  |  |  |  | my ($key, $type) = ($arguments->[$i], $arguments->[$i + 1]); | 
| 87 | 0 |  |  |  |  |  | push @accessors, $key; | 
| 88 |  |  |  |  |  |  | } | 
| 89 | 0 |  |  |  |  |  | $class->mk_accessors(@accessors); | 
| 90 |  |  |  |  |  |  | } | 
| 91 |  |  |  |  |  |  |  | 
| 92 |  |  |  |  |  |  | =head1 OBJECT METHODS | 
| 93 |  |  |  |  |  |  |  | 
| 94 |  |  |  |  |  |  | =head2 frame_wrap | 
| 95 |  |  |  |  |  |  |  | 
| 96 |  |  |  |  |  |  | Returns a L subclass object that wraps the given object, if possible. | 
| 97 |  |  |  |  |  |  |  | 
| 98 |  |  |  |  |  |  | =cut | 
| 99 |  |  |  |  |  |  |  | 
| 100 |  |  |  |  |  |  | sub frame_wrap { | 
| 101 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 102 |  |  |  |  |  |  |  | 
| 103 | 0 | 0 | 0 |  |  |  | if ($self->class_id && $self->method_id) { | 
|  |  | 0 |  |  |  |  |  | 
| 104 | 0 |  |  |  |  |  | return Net::AMQP::Frame::Method->new( method_frame => $self ); | 
| 105 |  |  |  |  |  |  | } | 
| 106 |  |  |  |  |  |  | elsif ($self->class_id) { | 
| 107 | 0 |  |  |  |  |  | return Net::AMQP::Frame::Header->new( header_frame => $self ); | 
| 108 |  |  |  |  |  |  | } | 
| 109 |  |  |  |  |  |  | else { | 
| 110 | 0 |  |  |  |  |  | return $self; | 
| 111 |  |  |  |  |  |  | } | 
| 112 |  |  |  |  |  |  | } | 
| 113 |  |  |  |  |  |  |  | 
| 114 |  |  |  |  |  |  | sub docs_as_pod { | 
| 115 | 0 |  |  | 0 | 0 |  | my $class = shift; | 
| 116 | 0 |  |  |  |  |  | my $package = __PACKAGE__; | 
| 117 |  |  |  |  |  |  |  | 
| 118 | 0 |  |  |  |  |  | my $class_spec = $class->class_spec; | 
| 119 | 0 |  |  |  |  |  | my $method_spec = $class->method_spec; | 
| 120 | 0 |  |  |  |  |  | my $frame_arguments = $class->frame_arguments; | 
| 121 |  |  |  |  |  |  |  | 
| 122 | 0 |  |  |  |  |  | my $description = "This is an auto-generated subclass of L<$package>; see the docs for that module for inherited methods.  Check the L below for details on the auto-generated methods within this class.\n"; | 
| 123 |  |  |  |  |  |  |  | 
| 124 | 0 | 0 |  |  |  |  | if ($class->method_id == 0) { | 
| 125 | 0 |  |  |  |  |  | my $base_class = 'Net::AMQP::Protocol::' . $class_spec->{name}; | 
| 126 | 0 |  |  |  |  |  | $description .= "\n" . < | 
| 127 |  |  |  |  |  |  | This class is not a real class of the AMQP spec.  Instead, it's a helper class that allows you to create L objects for L<$base_class> frames. | 
| 128 |  |  |  |  |  |  | EOF | 
| 129 |  |  |  |  |  |  | } | 
| 130 |  |  |  |  |  |  | else { | 
| 131 | 0 | 0 |  |  |  |  | $description .= "\n" . "This class implements the class B<$$class_spec{name}> (id ".$class->class_id.") method B<$$method_spec{name}> (id ".$class->method_id."), which is ".($method_spec->{synchronous} ? 'a synchronous' : 'an asynchronous')." method\n"; | 
| 132 |  |  |  |  |  |  | } | 
| 133 |  |  |  |  |  |  |  | 
| 134 | 0 |  |  |  |  |  | my $synopsis_new_args = ''; | 
| 135 | 0 |  |  |  |  |  | my $usage = < | 
| 136 |  |  |  |  |  |  | =head2 Fields and Accessors | 
| 137 |  |  |  |  |  |  |  | 
| 138 |  |  |  |  |  |  | Each of the following represents a field in the specification.  These are the optional arguments to B and are also read/write accessors. | 
| 139 |  |  |  |  |  |  |  | 
| 140 |  |  |  |  |  |  | =over | 
| 141 |  |  |  |  |  |  |  | 
| 142 |  |  |  |  |  |  | EOF | 
| 143 |  |  |  |  |  |  |  | 
| 144 | 5 |  |  | 5 |  | 9451 | use Data::Dumper; | 
|  | 5 |  |  |  |  | 54609 |  | 
|  | 5 |  |  |  |  | 1774 |  | 
| 145 |  |  |  |  |  |  | #$usage .= Dumper($method_spec); | 
| 146 |  |  |  |  |  |  |  | 
| 147 | 0 |  |  |  |  |  | foreach my $field_spec (@{ $method_spec->{fields} }) { | 
|  | 0 |  |  |  |  |  |  | 
| 148 | 0 |  |  |  |  |  | my $type = $field_spec->{type}; # may be 'undef' | 
| 149 | 0 | 0 |  |  |  |  | if ($field_spec->{domain}) { | 
| 150 | 0 |  |  |  |  |  | $type = $Net::AMQP::Protocol::spec{domain}{ $field_spec->{domain} }{type}; | 
| 151 |  |  |  |  |  |  | } | 
| 152 |  |  |  |  |  |  |  | 
| 153 | 0 |  |  |  |  |  | my $local_name = $field_spec->{name}; | 
| 154 | 0 |  |  |  |  |  | $local_name =~ s{ }{_}g; | 
| 155 |  |  |  |  |  |  |  | 
| 156 | 0 |  | 0 |  |  |  | $field_spec->{doc} ||= ''; | 
| 157 |  |  |  |  |  |  |  | 
| 158 | 0 |  |  |  |  |  | $usage .= < | 
| 159 |  |  |  |  |  |  | =item I<$local_name> (type: $type) | 
| 160 |  |  |  |  |  |  |  | 
| 161 |  |  |  |  |  |  | $$field_spec{doc} | 
| 162 |  |  |  |  |  |  |  | 
| 163 |  |  |  |  |  |  | EOF | 
| 164 |  |  |  |  |  |  |  | 
| 165 | 0 |  |  |  |  |  | $synopsis_new_args .= < | 
| 166 |  |  |  |  |  |  | $local_name => \$$local_name, | 
| 167 |  |  |  |  |  |  | EOF | 
| 168 |  |  |  |  |  |  | } | 
| 169 |  |  |  |  |  |  |  | 
| 170 | 0 |  |  |  |  |  | chomp $synopsis_new_args; # trailing \n | 
| 171 |  |  |  |  |  |  |  | 
| 172 | 0 |  |  |  |  |  | $usage .= "=back\n\n"; | 
| 173 |  |  |  |  |  |  |  | 
| 174 |  |  |  |  |  |  |  | 
| 175 | 0 |  |  |  |  |  | my $pod = < | 
| 176 |  |  |  |  |  |  | =pod | 
| 177 |  |  |  |  |  |  |  | 
| 178 |  |  |  |  |  |  | =head1 NAME | 
| 179 |  |  |  |  |  |  |  | 
| 180 |  |  |  |  |  |  | $class - An auto-generated subclass of $package | 
| 181 |  |  |  |  |  |  |  | 
| 182 |  |  |  |  |  |  | =head1 SYNOPSIS | 
| 183 |  |  |  |  |  |  |  | 
| 184 |  |  |  |  |  |  | use $class; | 
| 185 |  |  |  |  |  |  |  | 
| 186 |  |  |  |  |  |  | my \$object = $class\->new( | 
| 187 |  |  |  |  |  |  | $synopsis_new_args | 
| 188 |  |  |  |  |  |  | ); | 
| 189 |  |  |  |  |  |  |  | 
| 190 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 191 |  |  |  |  |  |  |  | 
| 192 |  |  |  |  |  |  | $description | 
| 193 |  |  |  |  |  |  |  | 
| 194 |  |  |  |  |  |  | =head1 USAGE | 
| 195 |  |  |  |  |  |  |  | 
| 196 |  |  |  |  |  |  | $usage | 
| 197 |  |  |  |  |  |  |  | 
| 198 |  |  |  |  |  |  | =head1 SEE ALSO | 
| 199 |  |  |  |  |  |  |  | 
| 200 |  |  |  |  |  |  | L<$package> | 
| 201 |  |  |  |  |  |  |  | 
| 202 |  |  |  |  |  |  | EOF | 
| 203 |  |  |  |  |  |  |  | 
| 204 | 0 |  |  |  |  |  | $pod =~ s{^ =}{=}gms; | 
| 205 |  |  |  |  |  |  |  | 
| 206 | 0 |  |  |  |  |  | return $pod; | 
| 207 |  |  |  |  |  |  | } | 
| 208 |  |  |  |  |  |  |  | 
| 209 |  |  |  |  |  |  | =head1 SEE ALSO | 
| 210 |  |  |  |  |  |  |  | 
| 211 |  |  |  |  |  |  | L | 
| 212 |  |  |  |  |  |  |  | 
| 213 |  |  |  |  |  |  | =head1 COPYRIGHT | 
| 214 |  |  |  |  |  |  |  | 
| 215 |  |  |  |  |  |  | Copyright (c) 2009 Eric Waters and XMission LLC (http://www.xmission.com/).  All rights reserved.  This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. | 
| 216 |  |  |  |  |  |  |  | 
| 217 |  |  |  |  |  |  | The full text of the license can be found in the LICENSE file included with this module. | 
| 218 |  |  |  |  |  |  |  | 
| 219 |  |  |  |  |  |  | =head1 AUTHOR | 
| 220 |  |  |  |  |  |  |  | 
| 221 |  |  |  |  |  |  | Eric Waters | 
| 222 |  |  |  |  |  |  |  | 
| 223 |  |  |  |  |  |  | =cut | 
| 224 |  |  |  |  |  |  |  | 
| 225 |  |  |  |  |  |  | 1; |