http://www.perlmonks.org?node_id=1041348

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

Given the following dependencies (obtained from CPAN Dependencies):

WWW::Salesforce::Simple --> SOAP::Lite --> LWP::UserAgent

is it possible to access LWP methods directly from my program that use the first one?

What I want to do is to establish a Salesforce session using the first package and then access special URLs from the SF site... well, I'm not sure if session managment from SOAP will provide me a way to retrieve arbitrary objects or pages, but I want to try.

Replies are listed 'Best First'.
Re: Access LWP method when using WWW::Salesforce::Simple module
by daxim (Curate) on Jun 29, 2013 at 16:05 UTC
    is it possible to access LWP methods directly from my program that [uses WWW::Salesforce::Simple]
    No, not without violating encapsulation. WWW::Salesforce::Simple does not expose the underlying SOAP::Lite object.

    WWW::Salesforce, however, does through the undocumented getClient method. SOAP::Lite then in turn exposes the LWP::UserAgent object through the useragent accessor, documented in SOAP::Schema.

Re: Access LWP method when using WWW::Salesforce::Simple module
by sundialsvc4 (Abbot) on Jun 29, 2013 at 13:38 UTC

    Well, yes.   But first, let’s clear up a basic misunderstanding about what use does.   Strictly speaking, this directive introduces Perl to the idea that “this” package will use “that” one.   Which you must do, in order to refer to it, i.e. to any objects or constants that it defines.   But (a little hand-waving here) the use statement does not, by itself, do anything.

    In your program, write one package whose job it is to create on-demand and then re-use a so-called “singleton” instance of an object that everyone else in the program can get ahold of, simply by useing your package and calling your routine.   It can be something like this:

    package myFactory; my $handle = undef; # NO ONE OUTSIDE THIS PACKAGE 'SEES' THIS sub factory { $handle = WWW::SalesForce::Simple->new() ... ## blah blah unless defined($handle); # NOTICE 'UNLESS' .. ONLY TRUE FIRST + TIME return $handle; } 1; # ALL PACKAGES MUST 'RETURN TRUE' }

    Anywhere else in your program that calls myFactory::factory will get the same object instance, representing a connection to SalesForce.   So, no one has to “pass it around” like some hot-potato, and a bunch of repetitive connections (which would not know about one another) don’t get created.   By means of this object (instance), you can now call its methods to get work done.

Re: Access LWP method when using WWW::Salesforce::Simple module
by vitoco (Hermit) on Jul 01, 2013 at 14:30 UTC

    Thank you for you answers!

    ... but I realized that it isn't possible to do what I wanted. Session management variables from WWW::Salesforce modules travels inside SOAP envelopes in consecutive requests, which are not available when trying to download arbitrary pages from Salesforce site. I guess I should try something like WWW::Mechanize to manage browser's session cookies to get those pages.