http://qs321.pair.com?node_id=624240


in reply to SOAP Modules (OO or not?)

Don't do that. SOAP really has nothing to do with object-oriented programming and doesn't really fit with it. You can make a class and have class methods called via SOAP, but there's no good way to make SOAP call methods on an object. In short, write your methods as class methods.

Replies are listed 'Best First'.
Re^2: SOAP Modules (OO or not?)
by rvosa (Curate) on Jul 29, 2007 at 00:03 UTC
    I'm probably misunderstanding your post, but you can place method calls on soap objects. At least, on my laptop :) Here's an object I have in a little script in my cgi-bin:
    #!/usr/bin/perl use SOAP::Transport::HTTP; SOAP::Transport::HTTP::CGI->dispatch_to('Object')->handle; package Object; sub new { my $class = shift; $class = ref($class) || $class; return bless { '_cache' => [] }, $class; } sub set { my ( $self, $arg ) = @_; $self->{'_field'} = $arg; push @{ $self->{'_cache'} }, $arg; } sub get { shift->{'_field'} } sub all { shift->{'_cache' } }
    Here's a simple client:
    #!/usr/bin/perl use strict; use warnings; use SOAP::Lite +autodispatch => uri => 'http://www.perlmonks.org/Object', proxy => 'http://localhost/cgi-bin/soap.pl'; my $obj = Object->new(); for ( qw'So how is it possible that it stores and returns these? ???' +) { $obj->set( $_ ); print $obj->get, "\n"; } print join ' ', @{ $obj->all };
    And sure enough, it prints:
    So how is it possible that it stores and returns these? ??? So how is it possible that it stores and returns these? ???
    I'm not quite sure how SOAP::Lite does this - some sort of session? And not even under mod_perl or anything, frankly I don't quite get it...
      I suspect SOAP::Lite is doing some additional work to serialize the blessing of the hash and move the hash back and forth when you call methods on it. I doubt this will work if you try to call it from another language, since AFAIK the SOAP spec doesn't support this.
Re^2: SOAP Modules (OO or not?)
by Cagao (Monk) on Jul 01, 2007 at 13:29 UTC
    Fair enough that SOAP doesn't really have anything to do with OO, however, and this is the bit that i'm really asking about...

    When SOAP dispatches to my module and method, the first thing passed to that method is the name of module, which leads me to think that it is being called in an OO context, and so i should bless it once i get inside.

    That would then keep all the code within the module all OO.

    Am I missing something? I'm not talking about treating it like an object when I pass it back through SOAP, although that would work fine too, so where's the harm?

      When SOAP dispatches to my module and method, the first thing passed to that method is the name of module, which leads me to think that it is being called in an OO context, and so i should bless it once i get inside.

      When a method receives a class name, not a blessed reference, it is being called as a class method. If you want to use OO features like inheritance, you can continue to call the other subs as class methods. You don't need to though.

      sub foo { my $class = shift; $class->bar(); # call bar() as a class method }

      I'm not talking about treating it like an object when I pass it back through SOAP, although that would work fine too, so where's the harm?

      That actually wouldn't work at all unless you did a lot of crazy workarounds. The XML serialization that SOAP uses is intentionally language-agnostic, so it has no way to represent the concept of something being blessed into a class.

        Hmmmm, as for sending an object back, maybe it doesn't know what class it is, but it doesn't need to for what i'm doing. I want people to be able to build a structure in the XML, say, to represent a customer, with an array of phone numbers, etc. I've been able to received such a structure, and put it directly in a hashref in the method, and then make some changes, and send back the hashref, which gets represented fine in the XML being sent back.