Mic

 view release on metacpan or  search on metacpan

lib/Mic.pm  view on Meta::CPAN

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 )