NAME
Class::Anonymous - Truly private classes with private data for Perl5
SYNOPSIS
use feature 'say';
use Class::Anonymous;
use Class::Anonymous::Utils ':all';
my $lifeform = class {
my ($self, $name) = @_;
method greeting => sub { "My name is $name" };
};
my $mortal = extend $lifeform => via {
my ($self, $name, $age) = @_;
around greeting => sub {
my $orig = shift;
$orig->() . " and I'm $age years old";
};
};
my $bob = $mortal->new('Bob', 40);
say $bob->greeting;
say 'Bob is mortal' if $bob->isa($mortal);
say 'Bob is a lifeform' if $bob->isa($lifeform);
DESCRIPTION
Class::Anonymous implements anonymous classes and private data. This private data is just the lexical variables available during the builder callback(s) that are used to build the class. If Package::Anon is available, then no stash entry is created at all. If not, then the classes will actually be blessed into Class::Anonymous::Instance though this is to be considered an implementation detail and subject to change.
The instance itself is a code reference which can be thought of as a meta-object. Called with a single string fetches the method of that name and returns it. Called with a string and a code reference attaches a new method to the object. Helper functions are provided in Class::Anonymous::Utils which provides "method" in Class::Anonymous::Utils and method modifiers for ease of use.
my $class = class {
my ($self) = @_;
$self->(mymethod = sub { ... });
my $mymethod = $self->('mymethod');
}
EXPORTED FUNCTIONS
class
my $class = class { my ($self) = @_; ... };
Define a new class. Takes a block (or code reference) which will be called to build and instance of that class. The callback is called with the new empty instance and any arguments passed to new
. Note that subclasses might need more initialization arguments, so you might want to plan for that.
extend
my $subclass = extend $class, sub { my ($self) = @_; ... };
Define a new subclass of an existing anonymous class. Takes an existing class and a code reference which will be called after the parent class builder callback(s). Note that all callbacks receive the same arguments, so you might want to plan for that.
via
my $subclass = extend $class, via { my ($self) = @_; ... };
Sugar for defining a code reference as a block, simply to make "extend" look better.
OTHER FUNCTIONS
instance
Builds a raw instance of a generic anonymous object. All arguments are the classes to be returned by isa
. By default it only fully implements the isa
, AUTOLOAD
and DESTROY
methods. If the instance implements the BUILD
method then it is itself a class and you can call new
on it.
Relationship to the class function
The "class" function simply creates an instance
when it creates a class. It then attaches a BUILD
function; this function creates another instance, calls all the BUILD
methods from all the isa
classes on it, then returns it.
SOURCE REPOSITORY
http://github.com/jberger/Class-Anonymous
AUTHOR
Joel Berger, <joel.a.berger@gmail.com>
COPYRIGHT AND LICENSE
Copyright (C) 2015 by Joel Berger
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.