/[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 136 by dpavlin, Mon Jul 14 23:12:07 2008 UTC revision 137 by dpavlin, Tue Jul 15 18:06:27 2008 UTC
# Line 42  sub package_path { Line 42  sub package_path {
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          if ( ! $package->can('meta') ) {          if ( ! $package->can('meta') ) {
48                  my $class = Moose::Meta::Class->create_anon_class;                  my $class = Moose::Meta::Class->create_anon_class;
49                  warn "package $package doesn't have meta faking anon class";                  warn "package $package isn't Moose, faking anon class";
50                  return ( $class, $class->meta, 0 );                  return ( $class, $class->meta, 0 );
51          }          }
52    
53          my $meta = $package->meta;          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 {  sub load_all_classes {

Legend:
Removed from v.136  
changed lines
  Added in v.137

  ViewVC Help
Powered by ViewVC 1.1.26