jeteve has asked for the wisdom of the Perl Monks concerning the following question:

Hi wise fellow monks.

In one of my projects, I implemented a subclass of HTTP::Requests to add extra attributes and methods to it. Basically as this:

package My::HTTPRequest ; use base qw/HTTP::Request/ ; sub new{ my ($class) = shift ; my $self = $class->SUPER::new(@_) ; $self->{'myA'} = undef ; return bless $self, $class ; } sub myM{ my ($self) = @_ ; ... } ... 1;

Everything is fine appart this problem: I got another module that produce standard HTTP::Requests objects and I want to turn those into my My::HTTPRequests. Basically, what I want to have is this:

my $httpr = AnotherModule::f() ; # $httpr is a plain HTTP::Request object my $ownHttpr = transform($httpr) ; # $ownHttpr should be an instance of My::HTTPRequest with all the prop +erties of $httpr .

According to you, what is the best way to implement the function transform ?

-- Nice photos of naked perl sources here !

Replies are listed 'Best First'.
Re: How to turn an object in my own subclass
by davorg (Chancellor) on Sep 05, 2006 at 10:14 UTC

    As part of your new method, you create a new HTTP::Request object. But in this new scenario, you already have an HTTP::Request object. So why not create a variation of your new method that works with an existing object.

    sub new_from_http_request { my ($class) = shift ; my $self = $shift ; $self->{myA} = undef ; return bless $self, $class ; }

    You can then do something like:

    my $httpr = AnotherModule::f() ; my $ownHttpr = My::HTTPRequest->new_from_http_request($httpr);

    Alternatively, you could use the same new method and just make it a bit cleverer:

    sub new{ my ($class) = shift ; my $self; if (@_) { my $self = shift ; } else { my $self = $class->SUPER::new(@_) ; } $self->{'myA'} = undef ; return bless $self, $class ; }

    In both cases, the code can probably be improved by using something like UNIVERSAL::isa to ensure that the parameter that you have been passed is actually an HTTP::Request object (or a subclass).

    --
    <http://dave.org.uk>

    "The first rule of Perl club is you do not talk about Perl club."
    -- Chip Salzenberg

      Thx !

      I ended choosing the second solution (the one with the single new method) just after asking the question :)

      Actually, writing down questions often lead you to think about a solution.

      -- Nice photos of naked perl sources here !

        Actually, writing down questions often lead you to think about a solution.

        That's why it's good to have a teddy bear (or a stuffed TuX) handy, according to Kernighan and Pike in The practice of programming.

        --
        David Serrano

Re: How to turn an object in my own subclass
by jdporter (Paladin) on Sep 05, 2006 at 15:08 UTC