use Mouse::Util 'get_linear_isa' instead of MRO::Compat directly
[gitmo/Mouse.git] / lib / Mouse / Util.pm
CommitLineData
4093c859 1#!/usr/bin/env perl
2package Mouse::Util;
3use strict;
4use warnings;
5use base 'Exporter';
6
7our %dependencies = (
8 'MRO::Compat' => {
9 'get_linear_isa' => {
10 loaded => \&mro::get_linear_isa,
11 not_loaded => do {
12 # this recurses so it isn't pretty
13 my $code;
14 $code = sub {
15 no strict 'refs';
16
17 my $classname = shift;
18
19 my @lin = ($classname);
20 my %stored;
21 foreach my $parent (@{"$classname\::ISA"}) {
22 my $plin = $code->($parent);
23 foreach (@$plin) {
24 next if exists $stored{$_};
25 push(@lin, $_);
26 $stored{$_} = 1;
27 }
28 }
29 return \@lin;
30 }
31 },
32 },
33 },
34);
35
36our @EXPORT_OK = map { keys %$_ } values %dependencies;
37
38for my $module_name (keys %dependencies) {
39 (my $file = "$module_name.pm") =~ s{::}{/}g;
40
41 my $loaded = do {
42 local $SIG{__DIE__} = 'DEFAULT';
43 eval "require '$file'; 1";
44 };
45
46 for my $method_name (keys %{ $dependencies{ $module_name } }) {
47 my $producer = $dependencies{$module_name}{$method_name};
48 my $implementation;
49
50 if (ref($producer) eq 'HASH') {
51 $implementation = $loaded
52 ? $producer->{loaded}
53 : $producer->{not_loaded};
54 }
55 else {
56 $implementation = $loaded
57 ? $module_name->can($method_name)
58 : $producer;
59 }
60
61 no strict 'refs';
62 *{ __PACKAGE__ . '::' . $method_name } = $implementation;
63 }
64}
65
661;
67