Object oriented perl gives you exactly the same flexibility.

If you have a module called "My::Module", and you call "My::Module->some_method", then you'd implement that like:

    sub some_method {
        my ($pkg, @args) = @_;
i.e. the module gets passed (as a string) as the first argument. You can then call

    $pkg->some_other_method;
And similarly, if you have an object "$foo" you would call it like "$foo->some_other_method" and implement it as:

    sub some_method {
        my ($self, @args) = @_;
i.e. the object gets passed as the first argument. And you can call "$self->some_other_method" with it.

A minimal class is just:

    package My::Module;

    sub new {
        my ($pkg, %opts) = @_;

        my $self = bless \%opts, $pkg;

        return $self;
    }

    1;
Don't let them tell you you need Moo or Moose or Mouse or fields.pm. Hand-rolled objects is the way :)