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 three special variables: $self, @args and %opts. 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..$#_], and %opts to "%{$_[1]}". Currently, both $self and @args are read-only; this means you cannot mutate them: $self = 'foo'; # error my $foo = shift @args; # 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 alone: use selfvars -self => 'this', -args => 'vars', -opts; # Use $this but leave @args and %opts alone: use selfvars -self => 'this', -args, -opts; # Use @vars but leave $self and %opts alone: use selfvars -args => 'vars', -self, -opts; You may also omit a variable name from the explicit import arguments: # Import $self but not @args nor %opts: use selfvars -self => 'self'; # Same as the above: use selfvars -self; # Import $self and %opts but not @args: 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: audreyt: selfvars.pm looks exactly like what I want self.pm to be in the beginning audreyt: but I can't sort out the last BEGIN{} block like you did. audreyt: that's a great job :D SEE ALSO self AUTHORS 唐鳳 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.