/[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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.100  
changed lines
  Added in v.274

  ViewVC Help
Powered by ViewVC 1.1.26