Role-Hooks
view release on metacpan or search on metacpan
t/mite/lib/Local/Mite.pm view on Meta::CPAN
## skip Test::Tabs
use 5.010001;
use strict;
use warnings;
package Local::Mite;
# NOTE: Since the intention is to ship this file with a project, this file
# cannot have any non-core dependencies.
use strict;
use warnings;
sub _is_compiling {
return $ENV{MITE_COMPILE} ? 1 : 0;
}
sub _make_has {
my ( $class, $caller, $file, $kind ) = @_;
return sub {
my $names = shift;
$names = [$names] unless ref $names;
my %args = @_;
for my $name ( @$names ) {
$name =~ s/^\+//;
my $default = $args{default};
if ( ref $default eq 'CODE' ) {
no strict 'refs';
${$caller .'::__'.$name.'_DEFAULT__'} = $default;
}
my $builder = $args{builder};
if ( ref $builder eq 'CODE' ) {
no strict 'refs';
*{"$caller\::_build_$name"} = $builder;
}
my $trigger = $args{trigger};
if ( ref $trigger eq 'CODE' ) {
no strict 'refs';
*{"$caller\::_trigger_$name"} = $trigger;
}
}
return;
};
}
sub import {
my ( $class, $kind ) = @_;
my ( $caller, $file ) = caller;
# Turn on warnings and strict in the caller
warnings->import;
strict->import;
$kind ||= 'class';
$kind = ( $kind =~ /role/i ) ? 'role' : 'class';
if( _is_compiling() ) {
require Mite::Project;
my $method = "inject_mite_$kind\_functions";
Mite::Project->default->$method(
package => $caller,
file => $file,
);
}
else {
# Work around Test::Compile's tendency to 'use' modules.
# Mite.pm won't stand for that.
return if $ENV{TEST_COMPILE};
# Changes to this filename must be coordinated with Mite::Compiled
my $mite_file = $file . ".mite.pm";
if( !-e $mite_file ) {
require Carp;
Carp::croak("Compiled Mite file ($mite_file) for $file is missing");
}
{
local @INC = ('.', @INC);
require $mite_file;
}
my $method = "_inject_mite_$kind\_functions";
$class->$method( $caller, $file );
}
}
my $parse_mm_args = sub {
my $coderef = pop;
my $names = [ map { ref($_) ? @$_ : $_ } @_ ];
( $names, $coderef );
};
{
my $get_orig = sub {
my ( $caller, $name ) = @_;
\&{ "$caller\::$name" };
};
sub before {
my ( $me, $caller ) = ( shift, shift );
my ( $names, $coderef ) = &$parse_mm_args;
for my $name ( @$names ) {
my $orig = $get_orig->( $caller, $name );
local $@;
eval <<"BEFORE" or die $@;
package $caller;
no warnings 'redefine';
sub $name {
\$coderef->( \@_ );
\$orig->( \@_ );
}
1;
( run in 1.193 second using v1.01-cache-2.11-cpan-7f9471e7e0a )