The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/perl
#

##################################################################
package Service;
use strict;

sub new {
    my ($class)  = shift;
    my (%params) = @_;
    bless { "_ports" => undef }, $class;
}

sub get_port {
    my $self = shift;
    my ($port_name) = @_;
    return $self->{'_ports'}->{$port_name};
}

sub get_port_binding {
    my $self = shift;
    my ($port_name) = @_;
    return $self->get_port($port_name)->binding();
}

sub add_port {
    my $self = shift;
    my $port = Service::Port->new(@_);
    $self->{'_ports'}->{ $port->name() } = $port;
}

##################################################################
package Service::Port;
use strict;

sub BEGIN {
    no strict 'refs';
    for my $method (qw(name bindingName binding)) {
        my $field = '_' . $method;
        *$method = sub {
            my $self = shift;
            @_
              ? ( $self->{$field} = shift, return $self )
              : return $self->{$field};
          }
    }
}

sub address {
    my $self = shift;
    return $self->binding->{'address'};
}

sub new {
    my ($class)  = shift;
    my (%params) = @_;

    bless {
        "_name"        => $params{"name"},
        "_binding"     => $params{"binding"},
        "_bindingName" => $params{"bindingName"}
    }, $class;
}

##################################################################
1;