The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Venus::Role - Role Builder

ABSTRACT

Role Builder for Perl 5

SYNOPSIS

  package Exemplar;

  use Venus::Role;

  sub handshake {
    return true;
  }

  package Example;

  use Venus::Class;

  with 'Exemplar';

  package main;

  my $example = Example->new;

  # $example->handshake;

DESCRIPTION

This package modifies the consuming package making it a modified Moo role, i.e. Moo::Role. All functions in Venus are automatically imported unless routines of the same name already exist.

INTEGRATES

This package integrates behaviors from:

Moo::Role

FEATURES

This package provides the following features:

has

This package supports the has keyword function and all of its configurations. See the Moo documentation for more details.

example 1

  package Example::Has;

  use Venus::Role;

  has 'data' => (
    is => 'ro',
    isa => sub { die }
  );

  package Example::HasData;

  use Venus::Class;

  with 'Example::Has';

  has '+data' => (
    is => 'ro',
    isa => sub { 1 }
  );

  package main;

  my $example = Example::HasData->new(data => time);
has-is

This package supports the is directive, used to denote whether the attribute is read-only or read-write. See the Moo documentation for more details.

example 1

  package Example::HasIs;

  use Venus::Class;

  has data => (
    is => 'ro'
  );

  package main;

  my $example = Example::HasIs->new(data => time);
has-isa

This package supports the isa directive, used to define the type constraint to validate the attribute against. See the Moo documentation for more details.

example 1

  package Example::HasIsa;

  use registry;

  use Venus::Class;

  has data => (
    is => 'ro',
    isa => 'Str' # e.g. Types::Standard::Str
  );

  package main;

  my $example = Example::HasIsa->new(data => time);
has-req

This package supports the req and required directives, used to denote if an attribute is required or optional. See the Moo documentation for more details.

example 1

  package Example::HasReq;

  use Venus::Class;

  has data => (
    is => 'ro',
    req => 1 # required
  );

  package main;

  my $example = Example::HasReq->new(data => time);
has-opt

This package supports the opt and optional directives, used to denote if an attribute is optional or required. See the Moo documentation for more details.

example 1

  package Example::HasOpt;

  use Venus::Class;

  has data => (
    is => 'ro',
    opt => 1
  );

  package main;

  my $example = Example::HasOpt->new(data => time);
has-bld

This package supports the bld and builder directives, expects a 1, a method name, or coderef and builds the attribute value if it wasn't provided to the constructor. See the Moo documentation for more details.

example 1

  package Example::HasBld;

  use Venus::Class;

  has data => (
    is => 'ro',
    bld => 1
  );

  sub _build_data {
    return rand;
  }

  package main;

  my $example = Example::HasBld->new;
has-clr

This package supports the clr and clearer directives expects a 1 or a method name of the clearer method. See the Moo documentation for more details.

example 1

  package Example::HasClr;

  use Venus::Class;

  has data => (
    is => 'ro',
    clr => 1
  );

  package main;

  my $example = Example::HasClr->new(data => time);

  # $example->clear_data;
has-crc

This package supports the crc and coerce directives denotes whether an attribute's value should be automatically coerced. See the Moo documentation for more details.

example 1

  package Example::HasCrc;

  use Venus::Class;

  has data => (
    is => 'ro',
    crc => sub {'0'}
  );

  package main;

  my $example = Example::HasCrc->new(data => time);
has-def

This package supports the def and default directives expects a non-reference or a coderef to be used to build a default value if one is not provided to the constructor. See the Moo documentation for more details.

example 1

  package Example::HasDef;

  use Venus::Class;

  has data => (
    is => 'ro',
    def => '0'
  );

  package main;

  my $example = Example::HasDef->new;
has-mod

This package supports the mod and modify directives denotes whether a pre-existing attribute's definition is being modified. This ability is not supported by the Moo object superclass.

example 1

  package Example::HasNomod;

  use Venus::Role;

  has data => (
    is => 'rw',
    opt => 1
  );

  package Example::HasMod;

  use Venus::Class;

  with 'Example::HasNomod';

  has data => (
    is => 'ro',
    req => 1,
    mod => 1
  );

  package main;

  my $example = Example::HasMod->new;
has-hnd

This package supports the hnd and handles directives denotes the methods created on the object which dispatch to methods available on the attribute's object. See the Moo documentation for more details.

example 1

  package Example::Time;

  use Venus::Class;

  sub maketime {
    return time;
  }

  package Example::HasHnd;

  use Venus::Class;

  has data => (
    is => 'ro',
    hnd => ['maketime']
  );

  package main;

  my $example = Example::HasHnd->new(data => Example::Time->new);
has-lzy

This package supports the lzy and lazy directives denotes whether the attribute will be constructed on-demand, or on-construction. See the Moo documentation for more details.

example 1

  package Example::HasLzy;

  use Venus::Class;

  has data => (
    is => 'ro',
    def => sub {time},
    lzy => 1
  );

  package main;

  my $example = Example::HasLzy->new;
has-new

This package supports the new directive, if truthy, denotes that the attribute will be constructed on-demand, i.e. is lazy, with a builder named new_{attribute}. This ability is not supported by the Moo object superclass.

example 1

  package Example::HasNew;

  use Venus::Class;

  has data => (
    is => 'ro',
    new => 1
  );

  sub new_data {
    return time;
  }

  package main;

  my $example = Example::HasNew->new(data => time);
has-pre

This package supports the pre and predicate directives expects a 1 or a method name and generates a method for checking the existance of the attribute. See the Moo documentation for more details.

example 1

  package Example::HasPre;

  use Venus::Class;

  has data => (
    is => 'ro',
    pre => 1
  );

  package main;

  my $example = Example::HasPre->new(data => time);
has-rdr

This package supports the rdr and reader directives denotes the name of the method to be used to "read" and return the attribute's value. See the Moo documentation for more details.

example 1

  package Example::HasRdr;

  use Venus::Class;

  has data => (
    is => 'ro',
    rdr => 'get_data'
  );

  package main;

  my $example = Example::HasRdr->new(data => time);
has-tgr

This package supports the tgr and trigger directives expects a 1 or a coderef and is executed whenever the attribute's value is changed. See the Moo documentation for more details.

example 1

  package Example::HasTgr;

  use Venus::Class;

  has data => (
    is => 'ro',
    tgr => 1
  );

  sub _trigger_data {
    my ($self) = @_;

    $self->{triggered} = 1;

    return $self;
  }

  package main;

  my $example = Example::HasTgr->new(data => time);
has-use

This package supports the use directive denotes that the attribute will be constructed on-demand, i.e. is lazy, using a custom builder meant to perform service construction. This directive exists to provide a simple dependency injection mechanism for class attributes. This ability is not supported by the Moo object superclass.

example 1

  package Example::HasUse;

  use Venus::Class;

  has data => (
    is => 'ro',
    use => ['service', 'time']
  );

  sub service {
    my ($self, $type, @args) = @_;

    $self->{serviced} = 1;

    return time if $type eq 'time';
  }

  package main;

  my $example = Example::HasUse->new;
has-wkr

This package supports the wkr and weak_ref directives is used to denote if the attribute's value should be weakened. See the Moo documentation for more details.

example 1

  package Example::HasWkr;

  use Venus::Class;

  has data => (
    is => 'ro',
    wkr => 1
  );

  package main;

  my $data = do {
    my ($a, $b);

    $a = { time => time };
    $b = { time => $a };

    $a->{time} = $b;
    $a
  };

  my $example = Example::HasWkr->new(data => $data);
has-wrt

This package supports the wrt and writer directives denotes the name of the method to be used to "write" and return the attribute's value. See the Moo documentation for more details.

example 1

  package Example::HasWrt;

  use Venus::Class;

  has data => (
    is => 'ro',
    wrt => 'set_data'
  );

  package main;

  my $example = Example::HasWrt->new;