MoFedge::Data::DBIC::Schemaのソースはっつけてみた
はてダでシンタックスハイライトがでけるようになったので!
package MoFedge::Data::DBIC::Schema; use strict; use warnings; use base qw/MoFedge DBIx::Class::Schema/; our $VERSION = '0.02'; use UNIVERSAL::require; use Switch; use Data::Page::Navigation; use Lingua::EN::Inflect; __PACKAGE__->load_components(qw/ +MoFedge::Data::DBIC::AutoSet +MoFedge::Data::DBIC::FromSledge +MoFedge::Data::DBIC::AutoInflateDateTime AsFdat PK::Auto Core /); sub datetime { my $class = shift; my $datetime_class = $class->base_name . '::DateTime'; $datetime_class->use or die $@; return $datetime_class; } # date issues. sub register_column { my ($class, $column) = @_; $class->next::method($column); switch ($column) { case /^created_on$/ { $class->datetime_column($column) } case /^updated_on$/ { $class->datetime_column($column) } case /_on$/ { $class->date_column($column) } case /_at$/ { $class->datetime_column($column) } case 'id' { $class->set_primary_key('id'); $class->resultset_attributes({ order_by => 'me.id DESC'}); } case 'rid' { $class->add_unique_constraint([$column]) } } } sub load_classes { my ($class, @args) = @_; $class->next::method(@args); for my $source_moniker ($class->sources) { my $source = $class->class($source_moniker); my @ordered_sources = $class->_ordered_sources; for my $column ($source->columns) { if ($column =~ /^(.+)_id$/) { my $column_head = $1; $class->_auto_relationship(\@ordered_sources, $source, $column, $column_head); } } } } sub _auto_relationship { my ($class, $ordered_sources, $source, $column, $column_head) = @_; for my $foreign_source (@$ordered_sources) { if ($column_head =~ $foreign_source->table) { $source->belongs_to($column, $foreign_source); # $self->user_id => $self->user no strict 'refs'; *{"$source\::$column_head"} = *{"$source\::$column"}; $foreign_source->has_many(Lingua::EN::Inflect::PL($source->table), $source, $column); last; } } } # sort sources order by table name length. sub _ordered_sources { my $class = shift; return map { $_->[0] } reverse sort { $a->[1] <=> $b->[1] } map { [ $_, length($_->table)] } map { $class->class($_) } $class->sources; } 1; __END__ =head1 NAME MoFedge::Data::DBIC::Schema - easy to use DBIx::Class from MoFedge. =head1 SYNOPSIS package Your::Schema; use base 'MoFedge::Data::DBIC::Schema'; __PACKAGE__->load_classes( ); =head1 DESCRIPTION DBIx::Class is easily used from MoFedge. =head1 METHODS =head2 register_column hook point. =head2 load_classes =head2 _auto_relationship =head2 _ordered_sources =head2 datetime hmm... this is utility method for MoFedge. This method will move to MoFedge.pm =head1 BUGS AND LIMITATIONS No bugs have been reported. =head1 AUTHOR Atsushi Kobayashi C<< <atsushi __at__ mobilefactory.jp> >> Tokuhiro Matsuno C<< tokuhirom aaaatttt mobilefactory.jp> >> =head1 LICENCE AND COPYRIGHT Copyright (c) 2006, Atsushi Kobayashi C<< <atsushi __at__ mobilefactory.jp> >>. All rights reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See L<perlartistic>.