Mic
view release on metacpan or search on metacpan
package Mic;
use strict;
use 5.008_005;
use Carp;
use Params::Validate qw(:all);
use Mic::Assembler;
our $VERSION = '0.001004';
$VERSION = eval $VERSION;
my $Class_count = 0;
our %Bound_implementation_of;
our %Contracts_for;
our %Spec_for;
our %Util_class;
sub import {
strict->import();
}
sub load_class {
my ($class, $spec) = @_;
$spec->{name} ||= "Mic::Class_${\ ++$Class_count }";
$class->assemble($spec);
}
sub assemble {
my (undef, $spec) = @_;
my $assembler = Mic::Assembler->new(-spec => $spec);
my $cls_stash;
if ( ! $spec->{name} ) {
my $depth = 0;
my $caller_pkg = '';
my $pkg = __PACKAGE__;
do {
$caller_pkg = (caller $depth++)[0];
}
while $caller_pkg =~ /^$pkg\b/;
$spec = $assembler->load_spec_from($caller_pkg);
}
_check_imp_aliases($spec);
my @args = %$spec;
validate(@args, {
interface => { type => HASHREF | SCALAR },
implementation => { type => SCALAR },
name => { type => SCALAR, optional => 1 },
});
return $assembler->assemble;
}
sub _check_imp_aliases {
my ($spec) = @_;
my @imp_aliases = qw[via impl];
foreach my $k (@imp_aliases) {
if (! exists $spec->{implementation} && exists $spec->{$k}) {
$spec->{implementation} = $spec->{$k};
delete @{$spec}{ @imp_aliases };
last;
}
}
}
*setup_class = \&assemble;
*define_class = \&assemble;
sub builder_for {
my ($class) = @_;
return $Util_class{ $class }
or confess "Unknown class: $class";
}
1;
( run in 2.638 seconds using v1.01-cache-2.11-cpan-84e82930d8c )