X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema.pm;h=678fe5ec34c64b47c0233d8eb8d06444eeb521fc;hb=7fb16f1a1bf1e7de4098b4f4ac3d061312f6bac3;hp=10296519b789dff7aa81659d490780c3ef2cb7ef;hpb=d7156e507aaffa832df977118f015e0833bc87ff;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Schema.pm b/lib/DBIx/Class/Schema.pm index 1029651..678fe5e 100644 --- a/lib/DBIx/Class/Schema.pm +++ b/lib/DBIx/Class/Schema.pm @@ -67,10 +67,11 @@ compose_connection to create/modify all the existing database classes. =cut sub register_class { - my ($class, $name, $to_register) = @_; - my %reg = %{$class->class_registrations}; + my ($self, $name, $to_register) = @_; + my %reg = %{$self->class_registrations}; $reg{$name} = $to_register; - $class->class_registrations(\%reg); + $self->class_registrations(\%reg); + $to_register->result_source->schema($self); } =head2 registered_classes @@ -85,6 +86,46 @@ sub registered_classes { return values %{shift->class_registrations}; } +=head2 class + + my $class = $schema->class('Foo'); + +Shortcut to retrieve a single class by its registered name + +=cut + +sub class { + my ($self, $class) = @_; + return $self->class_registrations->{$class}; +} + +=head2 source + + my $source = $schema->source('Foo'); + +Returns the result source object for the registered name + +=cut + +sub source { + my ($self, $class) = @_; + return $self->class_registrations->{$class}->result_source; +} + +=head2 resultset + + my $rs = $schema->resultset('Foo'); + +Returns the resultset for the registered name + +=cut + +sub resultset { + my ($self, $class) = @_; + return $self->class_registrations->{$class}->result_source->resultset; +} + + =head2 load_classes [, (, ), { => []}] Uses L to find all classes under the database class' namespace, @@ -136,6 +177,9 @@ sub load_classes { foreach my $comp (@{$comps_for{$prefix}||[]}) { my $comp_class = "${prefix}::${comp}"; eval "use $comp_class"; # If it fails, assume the user fixed it + if ($@) { + die $@ unless $@ =~ /Can't locate/; + } $class->register_class($comp => $comp_class); } } @@ -166,10 +210,20 @@ you expect. =cut sub compose_connection { - my ($class, $target, @info) = @_; + my ($self, $target, @info) = @_; my $conn_class = "${target}::_db"; - $class->setup_connection_class($conn_class, @info); - $class->compose_namespace($target, $conn_class); + $self->setup_connection_class($conn_class, @info); + my $schema = $self->compose_namespace($target, $conn_class); + $schema->storage($conn_class->storage); + foreach my $class ($schema->registered_classes) { + my $source = $class->result_source; + $source = $source->new($source); + $source->schema($schema); + $source->result_class($class); + $class->mk_classdata(result_source => $source); + $class->mk_classdata(resultset_instance => $source->resultset); + } + return $schema; } sub compose_namespace { @@ -177,21 +231,22 @@ sub compose_namespace { my %reg = %{ $class->class_registrations }; my %target; my %map; + my $schema = bless({ }, $class); while (my ($comp, $comp_class) = each %reg) { my $target_class = "${target}::${comp}"; - $class->inject_base($target_class, $comp_class, $base); + $class->inject_base($target_class, $comp_class, ($base ? $base : ())); @map{$comp, $comp_class} = ($target_class, $target_class); } + $schema->class_registrations(\%map); { no strict 'refs'; + *{"${target}::schema"} = + sub { $schema }; *{"${target}::class"} = - sub { - my ($class, $to_map) = @_; - return $map{$to_map}; - }; - *{"${target}::classes"} = sub { return \%map; }; + sub { shift->schema->class(@_) }; } $base->class_resolver($target); + return $schema; } =head2 setup_connection_class <$target> <@info>