/[Frey]/trunk/lib/Frey/ClassLoader.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /trunk/lib/Frey/ClassLoader.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 112 - (show annotations)
Sun Jul 13 16:54:13 2008 UTC (15 years, 9 months ago) by dpavlin
File size: 2310 byte(s)
sort class names before returning them
1 package Frey::ClassLoader;
2 use Moose;
3
4 extends 'Frey';
5
6 use Data::Dump qw/dump/;
7 use File::Find;
8
9 our $package_path;
10 our @classes;
11
12 sub classes {
13 my $self = shift;
14 return @classes if @classes;
15
16 # FIXME there must be better way to do this in Moose style
17 finddepth({ no_chdir => 1, wanted => sub {
18 return unless s/\.pm$//;
19 my @a = split(m!/!,$_);
20 my $package = join('::', @a[ 1 .. $#a ]);
21 warn ">> $_ ",dump( @a ), " >> $package\n" if $self->debug;
22 $package_path->{ $package } = "$_.pm";
23 } }, 'lib');
24 warn "## package_path = ",dump( $package_path ) if $self->debug;
25
26 @classes = sort keys %$package_path;
27 }
28
29 sub package_path {
30 my ( $self, $package ) = @_;
31 die "can't find path for package $package" unless defined $package_path->{$package};
32 return $package_path->{$package};
33 }
34
35 =head2 load_package
36
37 my ( $class, $meta, $is_role ) = $o->load_package( 'Some::Package' );
38
39 =cut
40
41 sub load_package {
42 my ( $self, $package ) = @_;
43
44 #intercept role application so we can accurately generate
45 #method and attribute information for the parent class.
46 #this is fragile, but there is not better way that i am aware of
47 my $rmeta = Moose::Meta::Role->meta;
48 $rmeta->make_mutable if $rmeta->is_immutable;
49 my $original_apply = $rmeta->get_method("apply")->body;
50 $rmeta->remove_method("apply");
51 my @roles_to_apply;
52 $rmeta->add_method("apply", sub{push(@roles_to_apply, [@_])});
53 #load the package with the hacked Moose::Meta::Role
54
55 #eval { Class::MOP::load_class($package); };
56 #confess "Failed to load package ${package} $@" if $@;
57 Class::MOP::load_class($package);
58
59 if ( ! $package->can('meta') ) {
60 my $class = Moose::Meta::Class->create_anon_class;
61 warn "package $package doesn't have meta faking anon class";
62 return ( $class, $class->meta, 0 );
63 }
64
65 my $meta = $package->meta;
66
67 my ($class, $is_role);
68 if($package->meta->isa('Moose::Meta::Role')){
69 $is_role = 1;
70 # we need to apply the role to a class to be able to properly introspect it
71 $class = Moose::Meta::Class->create_anon_class;
72 $original_apply->($meta, $class);
73 } else {
74 #roles don't have superclasses ...
75 $class = $meta;
76 }
77 return ( $class, $meta, $is_role );
78 }
79
80 sub load_all_classes {
81 my $self = shift;
82 my $loaded = 0;
83 foreach ( $self->classes ) {
84 Class::MOP::load_class($_);
85 $loaded++;
86 }
87 $loaded;
88 }
89
90 1;

  ViewVC Help
Powered by ViewVC 1.1.26