/[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 320 - (show annotations)
Thu Nov 6 16:05:45 2008 UTC (15 years, 5 months ago) by dpavlin
File size: 2261 byte(s)
move output to debug
1 package Frey::ClassLoader;
2 use Moose;
3
4 =head1 DESCRIPTION
5
6 Load L<Frey> classes
7
8 =cut
9
10 extends 'Frey';
11
12 use Data::Dump qw/dump/;
13 use File::Find;
14
15 our $class_path;
16 our @classes;
17
18 =head2 classes
19
20 my @classes = $o->classes;
21
22 =cut
23
24 sub classes {
25 my $self = shift;
26 return @classes if @classes;
27
28 # FIXME there must be better way to do this in Moose style
29 finddepth({ no_chdir => 1, wanted => sub {
30 return unless s/\.pm$//;
31 my @a = split(m!/!,$_);
32 my $class = join('::', @a[ 1 .. $#a ]);
33 warn ">> $_ ",dump( @a ), " >> $class\n" if $self->debug;
34 $class_path->{ $class } = "$_.pm";
35 } }, 'lib');
36 warn "## class_path = ",dump( $class_path ) if $self->debug;
37
38 @classes = sort keys %$class_path;
39 }
40
41 =head2 class_path
42
43 $path = $o->class_path( $class );
44
45 =cut
46
47 sub class_path {
48 my ( $self, $class ) = @_;
49 $self->classes unless $class_path;
50 confess "can't find path for class $class" unless defined $class_path->{$class};
51 return $class_path->{$class};
52 }
53
54 =head2 loaded_classes
55
56 my $available = $o->loaded_classes;
57 $available->{'Frey'} # true
58
59 =cut
60
61 our $loaded_class;
62 sub loaded_classes { $loaded_class };
63
64 =head2 class_meta
65
66 my ( $meta, $is_role ) = $o->class_meta( 'Some::Class' );
67
68 =cut
69
70 sub class_meta {
71 my ( $self, $class ) = @_;
72
73 $class ||= $self->class if $self->can('class');
74 warn "# class_meta $class";
75
76 $self->load_class($class);
77
78 if ( ! $class->can('meta') ) {
79 my $instance = Moose::Meta::Class->create_anon_class;
80 warn "class $class isn't Moose, faking anon class";
81 return ( $instance, 0 );
82 }
83
84 my $meta;
85 my $is_role = 0;
86 my $instance;
87
88 if($class->meta->isa('Moose::Meta::Role')){
89 $is_role = 1;
90 $instance = Moose::Meta::Class->create_anon_class;
91 $class->meta->apply( $instance );
92 $meta = $instance->meta;
93 die $@ if $@;
94 } else {
95 $meta = $class->meta;
96 }
97 return ( $meta, $is_role );
98 }
99
100 sub load_class {
101 my ( $self, $class ) = @_;
102 eval {
103 Class::MOP::load_class($class) if ! $loaded_class->{$class}++;
104 };
105 warn $@ if $@; # && $@ !~ m/role/;
106 warn "# load_class $class" if $self->debug && $loaded_class->{$class} == 1;
107 }
108
109 sub load_all_classes {
110 my $self = shift;
111 warn "# loaded_class = ",dump( $loaded_class ) if $self->debug;
112 $self->load_class( $_ ) foreach ( $self->classes );
113 $loaded_class;
114 }
115
116 1;

  ViewVC Help
Powered by ViewVC 1.1.26