Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW

Re^2: Inherit from a Role (or something like that)

by elTriberium (Friar)
on May 20, 2011 at 20:44 UTC ( #905972=note: print w/replies, xml ) Need Help??

in reply to Re: Inherit from a Role (or something like that)
in thread Inherit from a Role (or something like that)

Thanks, the other node you're referring to was an answer to my previous question :)
Are you saying that Server and Client each want a different derived class of the Connection, but the Connection may already be different concrete classes?
I'm not sure if I understand you here correctly: The basic idea is to have 2 interchangeable ways of providing "remote access" functionality to the Server and Client objects. The application will then do something like:
my $server = Server->new(type => "ssh"); # to create an SSH connection $server->run("ifconfig"); my $server2 = Server->new(type => "socket"); # to create a socket conn +ection $server2->run("ifconfig"); my $client = Client->new(type => "ssh"); $client->run("ls");
Where in this example "run" is defined in the Role and implemented by SSH and Socket.

Replies are listed 'Best First'.
Re^3: Inherit from a Role (or something like that)
by John M. Dlugosz (Monsignor) on May 20, 2011 at 23:37 UTC
    So Server and Client are both different from each other (though may share some stuff), and SSH and Socket are also different from each other but share a common interface.

    So, Server and Client (or their base class) "has" (not "is"!) a Connection. A Connection may be different concrete classes, or may be a single class that "has" a BackEnd. Note that in Perl you are more flexible in not having to define an "Interface" or have explicit base/derived relationships. Each concrete class can be implemented in any way it likes.

      Currently I only have the SSH module and now Server / Client "is" a SSH connection. The benefit of that is that I can just do things like:
      package SSH; has username => (is => 'rw', isa => 'Str'); sub connect { [...] $self->send($self->username); } package Client; extends qw(SSH); has username => (... default => 'admin'); package Server; extends qw(SSH); has username => (... default => 'root'); package main; my $client = Client->new(); my $server = Server->new(); $client->connect(); $server->connect();
      It's automatically using the correct username, because I'm overwriting this attribute of the SSH class in Client and Server. So, the point is, with SSH alone it works perfectly fine. I just have trouble adding the Socket alternative.
        So that's why you don't want to derive from it ("isa"), but contain one. Use delegation to expose the calls in the same manner that inheritance would. I do agree that passing the parameter in to create the contained object will be more work since something like that is not handled automatically. So far I've avoided that in my current project, but have speculated on passing the whole parameter list given to 'new' in to the builders for the helper objects, so each pulls the parameters it wants.

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://905972]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (2)
As of 2023-06-04 03:50 GMT
Find Nodes?
    Voting Booth?
    How often do you go to conferences?

    Results (17 votes). Check out past polls.