MooseX-Struct
view release on metacpan or search on metacpan
lib/MooseX/Struct.pm view on Meta::CPAN
package MooseX::Struct;
use warnings;
use strict;
use Moose ();
use Sub::Install;
use Carp;
our $VERSION = '0.06';
sub import {
my $class = shift;
strict->import;
warnings->import;
if (@_) {
my ($name, $attributes) = _parse_arg_structure(@_);
croak 'Can not build structure out of "main"' if $name eq 'main';
Moose->import({into => $name});
_build_struct($name, $attributes);
Sub::Install::install_sub({
into => $name,
code => \&immutable,
as => 'immutable',
});
} else {
my $caller = caller;
Moose->import({into => $caller}) unless $caller eq 'main';
Sub::Install::install_sub({
into => $caller,
code => \&immutable,
as => 'immutable',
});
Sub::Install::install_sub({
into => $caller,
code => \&struct,
as => 'struct',
});
}
}
sub _parse_arg_structure {
my ($name, $attr);
my $caller = (caller(1))[0];
# Check POD for cases
if (@_ == 1) {
# One arg, assume ( {} )
($name,$attr) = ($caller, shift);
} elsif (@_ == 2 && ref $_[1] eq 'HASH') {
# 2 args, second hashref, assume ('', {})
($name,$attr) = (shift, shift);
} else {
# True: Odd number of args, assume ('', ( '' => $ ))
# False: Even number of args (second one not hashref), ( ( '' => $ ) )
$name = (@_ % 2) ? shift : $caller;
my ($attr_name, $attr_spec);
while (my $attr_name = shift) {
$attr_spec = shift;
if (ref $attr_name eq 'ARRAY') {
$attr->{$_} = $attr_spec foreach @$attr_name;
} else {
$attr->{$attr_name} = $attr_spec;
}
( run in 0.575 second using v1.01-cache-2.11-cpan-7fcb06a456a )