Skip to content
Find file
Fetching contributors…
Cannot retrieve contributors at this time
134 lines (95 sloc) 3.61 KB
selfvars - Provide $self, @args, %opts and %hopts variables for OO
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 moudles exports four special variables: $self, @args, %opts and
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
Returns the arguments list as a hash.
Choosing non-default names
You can choose alternative variable names with explicit import
# 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
# 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.
Jump to Line
Something went wrong with that request. Please try again.