NAME
Attribute::Universal - Install attribute handlers directly into UNIVERSAL namespace
VERSION
version 0.003
SYNOPSIS
package Disco;
use Attribute::Universal Loud => 'CODE';
sub ATTRIBUTE {
my ($package, $symbol, $referent, $attr, $data) = @_;
# See Attribute::Handlers
}
# Attribute is installed global
sub Noise : Loud {
...
}
DESCRIPTION
According to the example above, this module does just this on import:
use Attribute::Handlers;
sub UNIVERSAL::Load : ATTR(CODE) {
goto &Disco::ATTRIBUTE;
}
Hint: the redefine warning is still enabled.
More than one attribute may be defined at import, with any allowed option:
use Attribute::Universal RealLoud => 'BEGIN,END', TooLoud => 'ANY,RAWDATA';
See Attributes::Handlers for more information about attribute handlers.
FUNCTIONS
import_into
Instead of installing an attribute in UNIVERSAL namespace (which may pollute it) the attributes can also installed directory into a target namespace.
package Producer;
use Attribute::Universal;
sub import {
my $caller = scalar caller;
Attribute::Universal->import_into($caller, 'MyAttribute' => 'RAWDATA');
}
sub ATTRIBUTE {
...
}
package Consumer;
use Producer;
sub Function : MyAttribute;
to_hash
sub ATTRIBUTE {
my $hash = Attribute::Universal::to_hash(@_);
}
Its hard to remember what arguments are given to ATTRIBUTE()
. This helper function converts the list into a hashref, with these keywords:
package
The package the attribute was used
symbol
The GlobRef to the named symbol or the string LEXICAL.
referent
The reference to the object itself (CodeRef, HashRef, ArrayRef or ScalarRef)
attribute
The name of the attribute
payload
The payload of all attributes, if used more than once. This is an ArrayRef of strings!
phase
The phase the attribute was covered. (BEGIN, CHECK, INIT, END)
file
The filename, if known
line
The linenumber, if known
And these additional keywords:
label
The name of the symbol. Imagine you have:
sub MyFunction : Attribute; our $MyScalar : Attribute;
so label becomes
MyFunction
andMyScalar
A lexical symbol cannot have a label.
type
The reftype of the referent (CODE, HASH, ARRAY, SCALAR)
sigil
The sigil by the reftype (
$
,@
,%
, c<&>)This keyword is available since v0.003
name
The name as sigil plus label (<$scalar>,
@array
,%hash
,&code
)This keyword is available since v0.003
full_name
The full name as sigil plus package plus label (<$package::scalar>,
@package::array
,%package::hash
,&package::code
)This keyword is available since v0.003
content
Like payload, but as a forced ArrayRef.
This keyword is available since v0.003
collect_by_referent
my $collection;
sub ATTRIBUTE {
my $hash = Attribute::Universal::collect_by_referent($collection, @_);
# OR
my $hash = Attribute::Universal::to_hash(@_);
Attribute::Universal::collect_by_referent($collection, $hash);
}
This helper collects all attributes by the refaddr of the referent and the attribute name:
{
refaddr($hash->{referent)} => {
$hash->{attribute} => $hash
}
}
The major difference is that, the keyword payload is stripped off, but content is grown if the attribute occured more than once at a referent. So after all, content is an ArrayRef holding all payloads together.
This function is available since v0.003
COMPATIBILITY
This module needs a minimum perl version of 5.16 - due to the magic on module import.
BUGS
Please report any bugs or feature requests on the bugtracker website https://github.com/zurborg/libattribute-universal-perl/issues
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.
AUTHOR
David Zurborg <zurborg@cpan.org>
COPYRIGHT AND LICENSE
This software is Copyright (c) 2015 by David Zurborg.
This is free software, licensed under:
The ISC License