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


selfvars - Provide $self, @args, %opts and %hopts variables for OO programs


    package MyClass;

    ### Import $self, @args, %opts and %hopts into your package:
    use selfvars;

    ### Or name the variables explicitly:
    # use selfvars -self => 'self', -args => 'args', -opts => 'opts', -hopts => 'hopts';

    ### Write the constructor as usual:
    sub new {
        return bless({}, shift);

    ### Use $self in place of $_[0]:
    sub foo {

    ### Use @args in place of @_[1..$#_]:
    sub bar {
        my ($foo, $bar) = @args;
        $self->{foo} = $foo;
        $self->{bar} = $bar;

    ### Use %opts in place of %{$_[1]}:
    sub baz {
        $self->{x} = $opts{x};
        $self->{y} = $opts{y};

    ### Use %hopts with $obj->yada( x => 1, y => 2 ) call syntax
    sub yada {
        $self->{x} = $hopts{x}
        $self->{y} = $hopts{y}


This module exports four special variables: $self, @args, %opts and %hopts.

They are really just handy helpers to get rid of:

    my $self = shift;

Behind the scenes, $self is simply tied to $_[0], @args to @_[1..$#_], %opts to %{$_[1]}, and %hopts% to %{{@_[1..$#_]}}.

Currently, $self, @args and %hopts are read-only; this means you cannot mutate them:

    $self = 'foo';              # error
    my $foo = shift @args;      # error
    $hopts{x} = 'y';            # error
    delete $hopts{x};           # error

This restriction may be lifted at a later version of this module, or turned into a configurable option instead.

However, %opts is not read-only, and can be mutated freely:

    $opts{x} = 'y';             # okay
    delete $opts{x};            # also okay



Returns the current object.


Returns the argument list.


Returns the first argument, which must be a hash reference, as a hash.


Returns the arguments list as a hash.

Choosing non-default names

You can choose alternative variable names with explicit import arguments:

    # Use $this and @vars instead of $self and @args, leaving %opts and %hopts alone:
    use selfvars -self => 'this', -args => 'vars', -opts, -hopts;

    # Use $this but leave @args, %opts and %hopts alone:
    use selfvars -self => 'this', -args, -opts, -hopts;

    # Use @vars but leave $self, %opts and %hopts alone:
    use selfvars -args => 'vars', -self, -opts, -hopts;

You may also omit one or more variable names from the explicit import arguments:

    # Import $self but not @args, %opts nor %hopts:
    use selfvars -self => 'self';

    # Same as the above:
    use selfvars -self;

    # Import $self and %opts but not @args nor %hopts:
    use selfvars -self, -opts;




This module was inspired and based on Kang-min Liu (gugod)'s

As seen on #perl:

    <gugod> audreyt: looks exactly like what I want to be in the beginning
    <gugod> audreyt: but I can't sort out the last BEGIN{} block like you did.
    <gugod> audreyt: that's a great job :D




唐鳳 <>

CC0 1.0 Universal

To the extent possible under law, 唐鳳 has waived all copyright and related or neighboring rights to selfvars.

This work is published from Taiwan.