Minions
view release on metacpan or search on metacpan
lib/Minions.pm view on Meta::CPAN
sub import {
my ($class, %arg) = @_;
if ( my $bindings = $arg{bind} ) {
foreach my $class ( keys %$bindings ) {
$Bound_implementation_of{$class} = $bindings->{$class};
}
}
elsif ( my $methods = $arg{declare_interface} ) {
my $caller_pkg = (caller)[0];
$Interface_for{$caller_pkg} = $methods;
}
else {
$class->minionize(\%arg);
}
}
sub minionize {
my (undef, $spec) = @_;
my $cls_stash;
if ( ! $spec->{name} ) {
my $caller_pkg = (caller)[0];
if ( $caller_pkg eq __PACKAGE__ ) {
$caller_pkg = (caller 1)[0];
}
$cls_stash = Package::Stash->new($caller_pkg);
$spec = { %$spec, %{ $cls_stash->get_symbol('%__meta__') || {} } };
$spec->{name} = $caller_pkg;
}
$spec->{name} ||= "Minions::Class_${\ ++$Class_count }";
lib/Minions/Implementation.pm view on Meta::CPAN
use strict;
use Minions::_Guts;
use Package::Stash;
use Readonly;
sub import {
my ($class, %arg) = @_;
strict->import();
$arg{-caller} = (caller)[0];
$class->define(%arg);
}
sub define {
my ($class, %arg) = @_;
my $caller_pkg = delete $arg{-caller} || (caller)[0];
my $stash = Package::Stash->new($caller_pkg);
$class->update_args(\%arg);
$class->add_attribute_syms(\%arg, $stash);
$stash->add_symbol('%__meta__', \%arg);
}
sub add_attribute_syms {
my ($class, $arg, $stash) = @_;
( run in 0.462 second using v1.01-cache-2.11-cpan-a3c8064c92c )