Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Problem with around BUILDARGS

by saintex (Scribe)
on Mar 24, 2011 at 10:56 UTC ( #895225=perlquestion: print w/ replies, xml ) Need Help??
saintex has asked for the wisdom of the Perl Monks concerning the following question:

Hello,
I would like to extends a package in order to have some default values.

The module I would like to extend is WWW::Selenium .

I would like to extend the package in my code, just to have some defualt values.
Ususally you call WWW::Selenium like this:
my $b=Selenium->new( host => "localhost", port => 4444, browser => "*firefox", browser_url => 'http://www.google.co +m', );
I would like to call it just with new, without args:
So I tried to write an extension:
package Selenium; our $VERSION=0.01; use 5.010; use Moose; use MooseX::NonMoose; use Test::WWW::Selenium; extends 'Test::WWW::Selenium'; around BUILDARGS => sub { my $orig = shift; my $class = shift; my %args = ( @_ == 1 ? %{ $_[0] } : @_ ); $args{host}//="localhost"; $args{port}//=4444; $args{browser}//="*firefox"; $args{browser_url}//='http://wwww.google.com'; return $class->$orig(%args); }; sub BUILD { my $self = shift; #$self->start; }


But it doesn't work. Without arguments I have an error.
Where I'm wrong?

Comment on Problem with around BUILDARGS
Select or Download Code
Re: Problem with around BUILDARGS
by stvn (Monsignor) on Mar 24, 2011 at 13:32 UTC

    With MooseX::NonMoose, you want to use FOREIGNBUILDARGS and it should return the arguments for the extended NonMoose class, this version works.

    sub FOREIGNBUILDARGS { my $class = shift; my %args = ( @_ == 1 ? %{ $_[0] } : @_ ); $args{host}//="localhost"; $args{port}//=4444; $args{browser}//="*firefox"; $args{browser_url}//='http://wwww.google.com'; return %args; }

    -stvn
      Thank you very much!
      It works,
      but how can I use some class proprieties inside FOREIGNBUILDARGS ?
      for example, If I try:
      has 'serverLocation' => (is=>'ro',isa=>'Str',default=>"$Bin/lib/seleni +um-server-standalone-2.0b2.jar"); sub FOREIGNBUILDARGS { my $self = shift; print $self->serverLocation; my %args = ( @_ == 1 ? %{ $_[0] } : @_ ); $args{host}//="localhost"; $args{port}//=4444; $args{browser}//="*firefox"; $args{browser_url}//='http://wwww.google.com'; return %args; }
      I have this error:

      Can't use string ("Selenium2") as a HASH ref while "strict refs" in us +e at accessor serverLocation defined at /home/saintex/workspace/perl_ +scripts/navigator/classes/Browser/Selenium2.pm line 18.

      because the propriety "serverLocation" has not been read yet.
      How can I fix it?

        So the problem is that $self is not an object instance, but rather the class. One way to solve this is to use builder instead of default like so.

        has 'serverLocation' => (is=>'ro',isa=>'Str',builder =>'buildServerLoc +ation'); sub buildServerLocation { return "$Bin/lib/selenium-server-standalone-2.0b2.jar" } sub FOREIGNBUILDARGS { my $class = shift; my %args = ( @_ == 1 ? %{ $_[0] } : @_ ); $args{serverLocation} ||= $class->buildServerLocation; $args{host}//="localhost"; $args{port}//=4444; $args{browser}//="*firefox"; $args{browser_url}//='http://wwww.google.com'; return %args; }

        -stvn

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://895225]
Approved by chrestomanci
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (10)
As of 2014-11-28 18:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My preferred Perl binaries come from:














    Results (199 votes), past polls