First stab at refactoring HTTP::Body
[catagits/HTTP-Body.git] / lib / HTTP / Body.pm
1 package HTTP::Body;
2
3 use strict;
4 use warnings;
5 use base 'Class::Accessor::Fast';
6
7 use Params::Validate    qw[];
8 use HTTP::Body::Context qw[];
9 use HTTP::Body::Parser  qw[];
10
11 __PACKAGE__->mk_accessors( qw[ context parser ] );
12
13 our $VERSION = 0.7;
14
15 sub new {
16     my $class = ref $_[0] ? ref shift : shift;
17     
18     # bring in compat for old API <= 0.6
19     if ( @_ == 2 ) {
20         require HTTP::Body::Compat;
21         return  HTTP::Body::Compat->new(@_);
22     }
23
24     my $params = Params::Validate::validate_with(
25         params  => \@_,
26         spec    => {
27             bufsize => {
28                 type      => Params::Validate::SCALAR,
29                 default   => 65536,
30                 optional  => 1
31             },
32             context => {
33                 type      => Params::Validate::OBJECT,
34                 isa       => 'HTTP::Body::Context',
35                 optional  => 0
36             },
37             parser  => {
38                 type      => Params::Validate::OBJECT,
39                 isa       => 'HTTP::Body::Parser',
40                 optional  => 1
41             }
42         },
43         called  => "$class\::new"
44     );
45
46     return bless( {}, $class )->initialize($params);
47 }
48
49 sub initialize {
50     my ( $self, $params ) = @_;
51     
52     my $bufsize = delete $params->{bufsize} || 65536;
53
54     $params->{parser} ||= HTTP::Body::Parser->new(
55         bufsize => $bufsize,
56         context => $params->{context}
57     );
58
59     while ( my ( $param, $value ) = each( %{ $params } ) ) {
60         $self->$param($value);
61     }
62
63     return $self;
64 }
65
66 sub eos {
67     return shift->parser->eos;
68 }
69
70 sub put {
71     return shift->parser->put(@_);
72 }
73
74 1;