Jojo::Base - Mojo::Base + lexical "has"
version 0.7.0
package Cat { use Jojo::Base -base; # requires perl 5.18+ has name => 'Nyan'; has ['age', 'weight'] => 4; } package Tiger { use Jojo::Base 'Cat'; has friend => sub { Cat->new }; has stripes => 42; } package main; use Jojo::Base -strict; my $mew = Cat->new(name => 'Longcat'); say $mew->age; say $mew->age(3)->weight(5)->age; my $rawr = Tiger->new(stripes => 38, weight => 250); say $rawr->tap(sub { $_->friend->name('Tacgnol') })->weight;
Jojo::Base works kind of like Mojo::Base but has is imported as lexical subroutine.
has
Jojo::Base, like Mojo::Base, is a simple base class designed to be effortless and powerful.
# Enables "strict", "warnings", "utf8" and Perl 5.18 and "lexical_subs" features use Jojo::Base -strict; use Jojo::Base -base; use Jojo::Base 'SomeBaseClass'; use Jojo::Base -role;
All four forms save a lot of typing. Note that role support depends on Jojo::Role (0.5.0+).
# use Jojo::Base -strict; use strict; use warnings; use utf8; use feature ':5.18'; use experimental 'lexical_subs'; use IO::Handle (); # use Jojo::Base -base; use strict; use warnings; use utf8; use feature ':5.18'; use experimental 'lexical_subs'; use IO::Handle (); push @ISA, 'Jojo::Base'; state sub has { ... } # attributes state sub with { ... } # role composition # use Jojo::Base 'SomeBaseClass'; use strict; use warnings; use utf8; use feature ':5.18'; use experimental 'lexical_subs'; use IO::Handle (); require SomeBaseClass; push @ISA, 'SomeBaseClass'; state sub has { ... } # attributes state sub with { ... } # role composition # use Jojo::Base -role; use strict; use warnings; use utf8; use feature ':5.18'; use experimental 'lexical_subs'; use IO::Handle (); use Jojo::Role; state sub has { ... } # attributes
On Perl 5.20+ you can also append a -signatures flag to all four forms and enable support for subroutine signatures.
-signatures
# Also enable signatures use Jojo::Base -strict, -signatures; use Jojo::Base -base, -signatures; use Jojo::Base 'SomeBaseClass', -signatures; use Jojo::Base -role, -signatures;
This will also disable experimental warnings on versions of Perl where this feature was still experimental.
Mojo::Base
All functions are exported as lexical subs
Role support depends on Jojo::Role instead of Role::Tiny
with is exported alongside has (when Jojo::Role is available)
with
Feature bundle for Perl 5.18 is enabled by default, instead of 5.10
Support for lexical subroutines is enabled by default
Jojo::Base implements the following functions, which can be imported with the -base flag, or by setting a base class.
-base
has 'name'; has ['name1', 'name2', 'name3']; has name => 'foo'; has name => sub {...}; has ['name1', 'name2', 'name3'] => 'foo'; has ['name1', 'name2', 'name3'] => sub {...};
Create attributes for hash-based objects, just like the "attr" in Mojo::Base method.
with 'SubClass::Role::One'; with '+One', '+Two';
Composes the current package with one or more Jojo::Role roles. For roles following the naming scheme MyClass::Role::RoleName you can use the shorthand +RoleName. Note that role support depends on Jojo::Role (0.5.0+).
MyClass::Role::RoleName
+RoleName
It works with Jojo::Role or Role::Tiny roles.
Jojo::Base inherits all methods from Mojo::Base and implements the following new ones.
my $new_class = SubClass->with_roles('SubClass::Role::One'); my $new_class = SubClass->with_roles('+One', '+Two'); $object = $object->with_roles('+One', '+Two');
Create a new class with one or more roles. If called on a class returns the new class, or if called on an object reblesses the object into the new class. For roles following the naming scheme MyClass::Role::RoleName you can use the shorthand +RoleName. Note that role support depends on Jojo::Role (0.5.0+).
# Create a new class with the role "SubClass::Role::Foo" and instantiate it my $new_class = SubClass->with_roles('+Foo'); my $object = $new_class->new;
Jojo::Base requires perl 5.18 or newer
Because a lexical sub does not behave like a package import, some code may need to be enclosed in blocks to avoid warnings like
"state" subroutine &has masks earlier declaration in same scope at...
Mojo::Base, Jojo::Role.
Thanks to Sebastian Riedel and others, the authors and copyright holders of Mojo::Base.
Adriano Ferreira <ferreira@cpan.org>
This software is Copyright (c) 2017 by Adriano Ferreira.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)
To install Jojo::Base, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Jojo::Base
CPAN shell
perl -MCPAN -e shell install Jojo::Base
For more information on module installation, please visit the detailed CPAN module installation guide.