in reply to Perl semi-object without a constructor

As far as I can see 'connect' *is* the constructor.

Whenever you see a construct that looks like Module->subroutine you should think "Class Method". The subroutine will be called with the Class name as the 1st parameter, and as expected it's used in a bless command.

Now that $conn is an object, all subroutines in it's class' (Msg) namespace and in the namespaces listed in Msg::ISA, can now be used as methods. Any such method will receive the blessed reference $conn implicitly as it's 1st parameter.

Replies are listed 'Best First'.
Re^2: Perl semi-object without a constructor
by Wiggins (Hermit) on Feb 20, 2013 at 20:14 UTC
    I went back and looked at all the subroutines.
    2 have $pkg as arg0 (event_loop() & new_server())
    7 have $conn as arg0
    3 don't take args
    1 starts with the line:
    shift unless ref($_[0]); # shift if first arg is package name

    So maybe the entire package is actually a class.

    With 1 dodgy routine:

    sub _new_client { my $sock = $main_socket->accept(); my $conn = bless { 'sock' => $sock, 'state' => 'connected' }, $g_pkg; #< different CLASSNAME my $rcvd_notification_proc = &$g_login_proc ($conn, $sock->peerhost(), $sock->peerport()); if ($rcvd_notification_proc) { $conn->{rcvd_notification_proc} = $rcvd_notification_proc; my $callback = sub {_rcv($conn,0)}; set_event_handler ($sock, "read" => $callback); } else { # Login failed $conn->disconnect(); } }

    It is always better to have seen your target for yourself, rather than depend upon someone else's description.

      Common Perl convention is that sub/method names beginning with an underscore are to be treated as private. The reason that sub _new_client is structured differently than the other subs in the package is because it's meant for internal use only and is not a part of the public interface.