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

SYNOPSIS
        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 {
            $self->{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}
        }

DESCRIPTION
    This moudles 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

INTERFACE
    $self
        Returns the current object.

    @args
        Returns the argument list.

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

    %hopts
        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;

DEPENDENCIES
    None.

ACKNOWLEDGEMENTS
    This module was inspired and based on Kang-min Liu (gugod)'s "self.pm".

    As seen on #perl:

        <gugod> audreyt: selfvars.pm looks exactly like what I want self.pm 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

SEE ALSO
    self

AUTHORS
    唐鳳 <cpan@audreyt.org>

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.

    <http://creativecommons.org/publicdomain/zero/1.0>