HTTP-Engine

 view release on metacpan or  search on metacpan

lib/HTTP/Engine/Interface.pm  view on Meta::CPAN

package HTTP::Engine::Interface;
use Any::Moose;
use Any::Moose (
    '::Util' => [qw/apply_all_roles/],
);

my $ARGS;

sub init_class {
    my $klass = shift;
    my $meta = any_moose('::Meta::Class')->initialize($klass);
    $meta->superclasses(any_moose('::Object'))
      unless $meta->superclasses;

    no strict 'refs';
    no warnings 'redefine';
    *{ $klass . '::meta' } = sub { $meta };
}

sub import {
    my $class = shift;

    my $caller  = caller(0);
    return if $caller eq 'main';

    $ARGS->{$caller} = {@_};

    no strict 'refs';
    *{"$caller\::__INTERFACE__"} = sub {
        my $caller = caller(0);
        __INTERFACE__($caller);
    };

    strict->import;
    warnings->import;

    init_class($caller);

    any_moose()->import({into_level => 1});
}

# fix up Interface.
sub __INTERFACE__ {
    my ($caller, ) = @_;

    my %args = %{ delete $ARGS->{$caller} };

    my $builder = delete $args{builder} or die "missing builder";
    my $writer  = delete $args{writer}  or die "missing writer";

    _setup_builder($caller, $builder);
    _setup_writer($caller,  $writer);

    apply_all_roles($caller, 'HTTP::Engine::Role::Interface');

    $caller->meta->make_immutable(inline_destructor => 1);

    "END_OF_MODULE";
}

sub _setup_builder {
    my ($caller, $builder ) = @_;
    $builder = ($builder =~ s/^\+(.+)$//) ? $1 : "HTTP::Engine::RequestBuilder::$builder";
    unless ($builder->can('meta')) {
        Any::Moose::load_class($builder);
        $@ and die $@;
    }

    my $instance = $builder->new;
    $caller->meta->add_method(request_builder => sub { $instance });
}

sub _setup_writer {
    my ($caller, $args) = @_;

    my $writer = _construct_writer($caller, $args)->new;
    
    $caller->meta->add_method(response_writer => sub { $writer });
}

sub _construct_writer {
    my ($caller, $args, ) = @_;

    my $writer = $caller . '::ResponseWriter';
    init_class($writer);

    {   
        $writer->meta->make_mutable 
            if Any::Moose::moose_is_preferred() 
            && $writer->meta->is_immutable;        

        my @roles;
        my $apply = sub { push @roles, "HTTP::Engine::Role::ResponseWriter::$_[0]" };
        if ($args->{finalize}) {



( run in 0.674 second using v1.01-cache-2.11-cpan-39bf76dae61 )