--- trunk/lib/Frey/ClassLoader.pm 2008/11/05 19:13:01 308 +++ trunk/lib/Frey/ClassLoader.pm 2008/11/19 00:40:03 431 @@ -17,6 +17,8 @@ =head2 classes +Return all local classes by reading from disk + my @classes = $o->classes; =cut @@ -40,6 +42,8 @@ =head2 class_path +Return any local or loaded class + $path = $o->class_path( $class ); =cut @@ -47,7 +51,14 @@ sub class_path { my ( $self, $class ) = @_; $self->classes unless $class_path; - confess "can't find path for class $class" unless defined $class_path->{$class}; + if ( ! defined $class_path->{$class} ) { + my $path = $class; + $path =~ s{::}{/}g; + $path .= '.pm'; + $path = $INC{$path}; + warn "# $class from INC $path"; + $class_path->{$class} = $path || confess "can't find path for $class"; + } return $class_path->{$class}; } @@ -63,7 +74,7 @@ =head2 class_meta - my ( $meta, $is_role ) = $o->class_meta( 'Some::Class' ); + my ( $meta, $is_role, $instance ) = $o->class_meta( 'Some::Class' ); =cut @@ -75,26 +86,24 @@ $self->load_class($class); - if ( ! $class->can('meta') ) { - my $instance = Moose::Meta::Class->create_anon_class; - warn "class $class isn't Moose, faking anon class"; - return ( $instance, 0 ); - } - my $meta; my $is_role = 0; my $instance; - if($class->meta->isa('Moose::Meta::Role')){ - $is_role = 1; + if ( ! $class->can('meta') ) { $instance = Moose::Meta::Class->create_anon_class; + warn "class $class isn't Moose, faking anon class" if $self->debug; + $meta = $instance->meta; + } elsif( $class->meta->isa('Moose::Meta::Role') ) { + $is_role = 1; + $instance = Frey->new; + warn "# apply $class on $instance"; $class->meta->apply( $instance ); $meta = $instance->meta; - die $@ if $@; } else { $meta = $class->meta; } - return ( $meta, $is_role ); + return ( $meta, $is_role, $instance ); } sub load_class { @@ -103,14 +112,45 @@ Class::MOP::load_class($class) if ! $loaded_class->{$class}++; }; warn $@ if $@; # && $@ !~ m/role/; - warn "# load_class $class" if $loaded_class->{$class} == 1; + warn "# load_class $class" if $self->debug && $loaded_class->{$class} == 1; } sub load_all_classes { my $self = shift; - warn "# loaded_class = ",dump( $loaded_class ); + warn "# loaded_class = ",dump( $loaded_class ) if $self->debug; $self->load_class( $_ ) foreach ( $self->classes ); $loaded_class; } +=head2 class_methods + + my @all_methods = $o->class_methods( $class ); + + my $class_method = $o->class_methods( $class ); + if ( $class_method->{ $method } ) { + # $class has $method + } + +=cut + +sub class_methods { + my ( $self, $class ) = @_; + + confess "need class" unless $class; + if ( ! $class->can('meta') ) { + warn "$class doesn't have meta (isn't Moose class)" if $self->debug; + return; + } + my $meta = $class->meta; + + my $attr; + my $methods; + $attr->{$_}++ foreach $meta->get_attribute_list; + my @methods = map { $methods->{$_}++; $_ } grep { ! defined($attr->{$_}) && $_ ne 'meta' } $meta->get_method_list; + warn "# methods = ",dump( @methods ) if $self->debug; + + return @methods if wantarray; + return $methods; +} + 1;